从另一个类调用方法

时间:2014-01-23 21:41:25

标签: python list class

class Switch():

    def __init__(self, mode):
        self._mode = mode
        if self._mode == '1':
            self._mode = True
        if self._mode == '0':
            self._mode = False

    def flip(self):
        if self._mode is True:
            self._mode = False
        if self._mode is False:
            self._mode = True


class Flip():

    def __init__(self, lst):
        self._lst = []
        for i in range(lst):
            self._lst.append(False)

    def flip(self, n):
        self._lst[n] = Switch.flip(self) #problem here

到目前为止我遇到的问题是当我从另一个类调用一个函数时它会抛出一个错误。

Switch类的功能:

如果您传递'1'作为参数,它会将其更改为True,如果您传递'0'作为参数,它会将其更改为False。 Switch中的flip方法改变了模式,所以如果它是True,它将把它改为False等。

Flip课程的作用:

如果您传递一个数字作为参数,它将创建一个包含许多元素的列表,但不是数字,而是将False放在适当的位置。恩。如果你传递10,而不是[0,1,2,3,4,5,6,7,8,9]你得到[假,假,假,假,......]。 Flip中的翻转方法将从Switch调用flip方法并在给定索引处更改其状态。防爆。 [False,False,False]你用2作为n调用flip,然后你会得到[False,False,True]

然而,当我.flip(2)它抛出一个错误:

f1 = Flip(10)
f1.flip(2)
Traceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 1, in <module>
    # Used internally for debug sandbox under external interpreter
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 25, in flip
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 11, in flip
builtins.AttributeError: 'Flip' object has no attribute '_mode'

不确定要改变什么才能解决此问题。课程对我来说是新的,所以不太确定:/

4 个答案:

答案 0 :(得分:1)

您有两个问题(请查看下面的修改后的代码,以及我的两条评论 - 我在哪里做了更改)。

class Switch():

    def __init__(self, mode):
        self._mode = mode
        if self._mode == '1':
            self._mode = True
        if self._mode == '0':
            self._mode = False

    def flip(self):
        if self._mode is True:
            self._mode = False
        if self._mode is False:
            self._mode = True
        return self._mode  # need to return this for Flip class's method

class Flip():

    def __init__(self, lst):
        self._lst = []
        for i in range(lst):
            self._lst.append(False)

    def flip(self, n):
        # need to initialize Switch with the current mode
        self._lst[n] = Switch(self._lst[n]).flip()  

此外,所有python类都应该继承自object或后代(但这与您的问题无关)。

答案 1 :(得分:1)

我认为你应该重新思考你的班级设计。这可能只是帮助自学课程的一个例子。确定什么应该成为一个类的一种方法称为“名词提取”。首先创建一个系统如何工作的叙述(例如“当一个人翻转开关,灯打开或关闭时”)然后提取名词列表:人,开关,灯。你的课程将成为这些名词的一部分。动词(翻转,打开,关闭)成为这些类中的方法。

我认为您的Switch类可以解决您需要的大部分问题。 Flip类可能会被删除。您可以使用您拥有的代码创建一个Switch对象并在其上运行方法:

myswitch = Switch(1)
print myswitch._mode
myswitch.flip()
print myswitch._mode

答案 2 :(得分:0)

您需要创建一个传入Switch变量的mode对象,并删除传递给的self变量:

self._lst[n] = Switch.flip(self) #problem here

所以看起来应该是这样的:

sw = Switch(mode)
self._lst[n] = sw.flip()

答案 3 :(得分:0)

要调用flip()方法,您需要拥有类Switch的实例,因为大多数答案已经说过了。阅读Python documentation on Class Objects应该会给你一个良好的开端。

您还有其他几个与此代码混淆的机会。这是一个实现,可以解决将来可能会遇到的一些问题。

class Switch():

    # mode should be a boolean True/False
    def __init__(self, mode):
        self._mode = mode

    # since mode is boolean you can invert it with 'not'
    def flip(self):
        self._mode = not self._mode

    def __str__(self, ):
        return '1' if self._mode else '-'

class Flip():
    def __init__(self, switch_count ):
        # creates N Switch instances to store in the flip array
        # Switch() creates an instance
        # [ ... for x in ... ] is a list comprehension, you could just
        #    as easily leave your for loop, but this seems more like
        #    what you're trying to accomplish
        self._lst = [Switch(False) for i in range(switch_count)]

    def flip(self, n):
        # _list[n] access the Switch() instance, and flips it
        self._lst[n].flip()

    def __str__(self):
        return "Switches:" + ''.join([str(x) for x in self._lst])

<强>更改

  • 将所有True / False值表示为switch类中的布尔值
  • 可以使用not而不是使用条件
  • 来反转布尔值
  • 添加了一个__str__,它返回实例的字符串表示形式,这对调试很有用。
  • (高级)在Flip构造函数中使用list comprehension而不是循环。所有的pythonic都是如此而又柔和。

用法:

f = Flip(5)
print f
#outputs
#Switches:-----

f.flip(1)
f.flip(3)
f.flip(4)
print f
#outputs
#Switches:-1-11

f.flip(3)
f.flip(4)
print f
#outputs
#Switches:-1---