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

hab*_*kuk 3 python properties

我有一堂课

class ActivationResult(object):

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

    def getSuccessful(self) -> bool:
        return self._successful
Run Code Online (Sandbox Code Playgroud)

还有一个测试

def testSuccessfulFromCreate(self):

    target = ActivationResult(True)

    self.assertEquals(target._successful, True)
    self.assertEquals(target.getSuccessful, True)
Run Code Online (Sandbox Code Playgroud)

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

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

d6b*_*els 8

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

self.assertEquals(target.getSuccessful(), True)  # With parenthesss
Run Code Online (Sandbox Code Playgroud)

第一次没问题,因为您获得了属性_successful,该属性已正确初始化为True
但是当您调用target.getSuccessful它时,它会为提供方法对象本身,您似乎想要实际调用该方法。


解释

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

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

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

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

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

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

s = Something()
print(s.somefunction())  # WITH parentheses
>>>Hello SO!
>>>42
Run Code Online (Sandbox Code Playgroud)

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