【发布时间】:2019-01-22 07:51:58
【问题描述】:
我偶然发现了这种行为,这表明您可以使用getattr 来调用类实例上的方法,以替代直观命名的operator.methodcaller:
from operator import methodcaller
class Foo():
def __init__(self, lst):
self.lst = lst
def summer(self):
return sum(self.lst)
my_obj = Foo(range(11))
res1 = methodcaller('summer')(my_obj) # 55
res2 = getattr(my_obj, 'summer')() # 55
assert res1 == res2
我想了解,在内部,为什么这有效。是不是因为所有的方法也是属性?这似乎是这样的,因为dir(Foo) 或dir(my_obj) 包括'summer'。但我从未听说过称为类或类实例的 attributes 的方法,例如What is a “method” in Python?中没有提到这一点
有一个explanation in the docs 提到了我无法理解的“数据属性”和“非数据属性”之间的区别。
更新:@Amadan 的评论澄清了上述大部分内容。剩下的唯一一点我不明白的是文档摘录:
如果您仍然不了解方法的工作原理,请查看 实施也许可以澄清问题。当一个非数据属性 引用实例的,搜索实例的类。如果 该名称表示作为函数对象的有效类属性, 方法对象是通过打包(指向)实例对象来创建的 和刚刚在抽象对象中找到的函数对象: 这是方法对象。
那么非数据属性是通过检查它是否可调用来确定的,还是有其他方法可以用来确定它是一个函数对象?指向实例对象的“打包指针”是什么意思?什么是抽象对象?
【问题讨论】:
-
Here: "另一种实例属性引用是方法。"非常明确地说:有些属性只是数据,但有些属性是方法。
-
看看文档怎么说
methodcalleris equivalent to :) -
@Amadan,谢谢!我想要澄清的唯一剩下的事情是文档中关于数据与非数据属性的评论。我稍后会更新我的问题。
标签: python oop methods attributes