【问题标题】:Python Beginner - where comes <bound method ... of <... object at 0x0000000005EAAEB8>> from?Python Beginner - <... object at 0x0000000005EAAEB8>> 的 <bound method ... 来自哪里?
【发布时间】:2015-05-06 22:37:06
【问题描述】:

我有课

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: &lt;bound method ActivationResult.getSuccess[84 chars]EB8&gt;&gt; != True

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

【问题讨论】:

  • 错误信息非常清楚 - 您在比较方法本身,而不是在调用时返回的值。此外,在 Python 中不需要 get/set;直接访问属性或使用@property
  • @PM2Ring:我尝试使用python.org/dev/peps/pep-3107 中提到的stackoverflow.com/a/21384492/254041(它不会产生任何错误或警告)。
  • @PM2Ring 那是一个函数注解

标签: python properties


【解决方案1】:

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

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

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


说明

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

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>>

我们得到与您的问题相同的输出&lt;bound method ... at 0x...&gt;。这就是打印自身时方法的表示方式。

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

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

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

【讨论】:

  • 嗯,我知道这可能只是一个错字,你忘记了括号,但是当你在标题中加上“初学者”时,我想我会解释一些我希望有用的东西。
  • 感谢您的回答 - 对加深理解很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 2017-11-23
  • 1970-01-01
  • 2018-01-04
  • 2010-09-21
  • 2014-04-24
相关资源
最近更新 更多