关于属性:python初学者AssertionError: > != True

Python Beginner - where comes <bound method … of <… object at 0x0000000005EAAEB8>> from?

我有一节课

1
2
3
4
5
6
7
class ActivationResult(object):

    def __init__(self, successful : bool):
        self._successful = successful

    def getSuccessful(self) -> bool:
        return self._successful

和一个测试

1
2
3
4
5
6
def testSuccessfulFromCreate(self):

    target = ActivationResult(True)

    self.assertEquals(target._successful, True)
    self.assertEquals(target.getSuccessful, True)

第一个断言是好的,但第二个断言与AssertionError: > != True失败。

同样的事情也会发生,当我试图打印它的时候。为什么?


您得到的是方法,而不是调用它。尝试:

1
self.assertEquals(target.getSuccessful(), True)  # With parenthesss

第一次没问题,因为您得到了属性_successful,它是用True正确初始化的。但是当您调用target.getSuccessful时,它会给您方法对象本身,在这里您似乎希望实际调用该方法。

解释

以下是打印对象方法时发生的相同情况的示例:

1
2
3
4
class Something(object):
    def somefunction(arg1, arg2=False):
        print"Hello SO!"
        return 42

我们有一个类,有一个方法。现在,如果我们打印它,但不调用它:

1
2
3
s = Something()
print s.somefunction  # NO parentheses
>>> <bound method Something.somefunction of <__main__.Something object at 0x7fd27bb19110>>

我们得到的输出与您的问题相同。这就是方法在打印自身时的表示方式。

现在,如果我们把它打印出来并称之为:

1
2
3
4
s = Something()
print s.somefunction()  # WITH parentheses
>>>Hello SO!
>>>42

方法被调用(它打印Hello SO!,它的返回也被打印(42)