首先,我了解一般情况下,一个装修师是如何工作的。我知道@staticmethod
去掉了签名中的实例参数,使
class C(object):
@staticmethod
def foo():
print 'foo'
C.foo //<function foo at 0x10efd4050>
C().foo //<function foo at 0x10efd4050>
有效的。在
但是,我不明白staticmethod
的源代码是如何实现这一点的。在
在我看来,当在staticmethod
中包装方法foo
时,staticmethod
的一个实例被实例化,然后发生了一些神奇的,使C.foo()
合法。在
所以。。那些魔法会发生什么?staticmethod
做了什么?在
我知道关于staticmethods
的大量话题,但没有一个能解决我的疑问。但也许我没有找到那个神奇的关键词。如果是,请告诉我。在
对于寻找staticmethod
源代码的人,请参考https://hg.python.org/cpython/file/c6880edaf6f3/Objects/funcobject.c
staticmethod
对象是descriptor。您缺少的魔力是Python在将对象作为类或实例的属性访问时调用__get__
方法。在因此,以}则变成{}。在
C.foo
的形式访问对象会导致Python将其转换为C.__dict__['foo'].__get__(None, C)
,而{staticmethod
对象是defined in C code,但在Python中等效对象是:其中
self.f
是原始的包装函数。在所有这些都是必需的,因为函数本身也是描述符;正是描述符协议提供了方法对象(有关详细信息,请参见python bound and unbound method object)。因为它们也有一个
__get__
方法,没有staticmethod
对象包装函数,functionobj.__get__
调用将生成一个方法对象,并传递一个self
参数。在还有一个
classmethod
,它使用descriptor.__get__
的第二个参数将函数绑定到类,然后还有property
对象,它们直接将绑定转换为函数调用。见How does the @property decorator work?。在相关问题 更多 >
编程相关推荐