我实际上正在浏览descriptors个python文档并遇到了这个例子
>>> class D(object):
def f(self, x):
return x
>>> d = D()
>>> D.__dict__['f'] # Stored internally as a function
<function f at 0x00C45070>
>>> id(D.__dict__['f']) # Memory location
49294384
>>> D.f # Get from a class becomes an unbound method
<unbound method D.f>
>>> id(D.f )
48549440
>>> d.f # Get from an instance becomes a bound method
<bound method D.f of <__main__.D object at 0x00B18C90>>
>>> id(d.f)
48549440
所以从上面的代码中,我理解python将类的function definition/declaration
作为单独的对象存储在类__dict__
变量内部,当我们直接使用__dict__
变量访问它时内存位置为49294384
但是,当通过memory location 48549440
Class or Object?
访问时,为什么它会显示为具有不同D.f and d.f
的不同功能/方法对象
当我们使用__dict__
变量访问时,它不应该引用同一个对象吗?如果是这样的话?
答案 0 :(得分:2)
D.f
是一个带有一个参数的函数(self
)
x = D.f
x(d)
d.f
是一个“绑定方法”,即已填写self
参数的函数。您可以说
x = d.f
x()
因此它不能与D.f
相同,必须位于不同的位置。
答案 1 :(得分:0)
xtofi解释了描述符对象(未绑定)和绑定方法之间的区别。
我认为缺少的部分是绑定方法不会保存在内存中,并且每次访问它们时都会创建它们。 (您可能会获得相同的内存位置,但它不是同一个对象)。
<强>为什么吗 因为在描述符上的每次调用都可能导致不同的行为。这是一个解释这个想法的例子。
class A(object):
i = 'a'
@property
def name(self):
if A.i == 'a':
return self.fa()
else:
return self.fb()
def fa(self):
print 'one function'
def fb(self):
print 'another function'
在A的实例上调用函数name
会导致不同的函数调用。