Python初学者 - 来自哪里<bound method =“”... =“”of =“”<... =“”object =“”at =“”0x0000000005eaaeb8 =“”>&gt;从?</绑定>

时间:2015-03-05 14:15:09

标签: python properties

我有一个班级

class ActivationResult(object):

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

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

并进行测试

def testSuccessfulFromCreate(self):

    target = ActivationResult(True)

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

第一个断言很好,但第二个断言失败了AssertionError: <bound method ActivationResult.getSuccess[84 chars]EB8>> != True

当我尝试打印时,同样的事情发生了。为什么呢?

1 个答案:

答案 0 :(得分:1)

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

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

第一次就行了,因为您获得的属性_successful已使用True正确初始化。
但是当你打电话给target.getSuccessful时,给你方法对象本身,你似乎想要实现调用那个方法。


<强>解释

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

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

我们有一个班级,有一个方法 现在,如果我们打印它,但不打电话

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

我们获得与您的问题相同的输出<bound method ... at 0x...>。这就是在打印时如何表示方法。

现在,如果我们打印并实际调用它:

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

调用该方法(打印Hello SO!),并打印其返回值(42