在python中调用类vs对象的函数

时间:2018-05-15 08:36:54

标签: python function class object

我实际上正在浏览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__变量访问时,它不应该引用同一个对象吗?如果是这样的话?

2 个答案:

答案 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会导致不同的函数调用。