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

7

我有一个类

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
错误信息非常明确 - 你正在比较方法本身,而不是调用它时返回的值。此外,在Python中不需要使用get/set;可以直接访问属性或使用@property - jonrsharpe
@PM2Ring:我尝试使用https://www.python.org/dev/peps/pep-3107/,如https://dev59.com/GXE95IYBdhLWcg3wCJXk#21384492中所述(它不会产生任何错误或警告)。 - habakuk
@PM2Ring 这是一个函数注释。 - jonrsharpe
1个回答

10
你得到的是方法,而不是调用它。
尝试:
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)。

我意识到这可能只是一个笔误,你忘了括号,但由于你在标题中加入了“初学者”,所以我想解释一些有用的东西。 - d6bels
谢谢你的回答 - 对于更深入的理解非常有帮助。 - habakuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接