Python 初学者 - <bound method ... of <... object at 0x0000000005EAAEB8>> 来自哪里?

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

我有一个class

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

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

您正在获取方法,而不是调用它。
尝试:

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

第一次没问题,因为你得到了 _successful 属性,它是用 True 正确初始化的。
但是当你调用 target.getSuccessful 给你 方法对象 本身 ,你似乎想要实际 调用那个方法。


说明

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

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

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

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!),它的return也被打印(42