有人能解释一下staticmethod的源代码是如何在python中工作的吗

2024-03-29 14:39:37 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我了解一般情况下,一个装修师是如何工作的。我知道@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


Tags: 实例方法参数object源代码foodef魔法
1条回答
网友
1楼 · 发布于 2024-03-29 14:39:37

staticmethod对象是descriptor。您缺少的魔力是Python在将对象作为类或实例的属性访问时调用__get__方法。在

因此,以C.foo的形式访问对象会导致Python将其转换为C.__dict__['foo'].__get__(None, C),而{}则变成{}。在

staticmethod对象是defined in C code,但在Python中等效对象是:

class staticmethod(object):
    def __init__(self, callable):
        self.f = callable
    def __get__(self, obj, type=None):
        return self.f
    @property
    def __func__(self):
        return self.f

其中self.f是原始的包装函数。在

所有这些都是必需的,因为函数本身也是描述符;正是描述符协议提供了方法对象(有关详细信息,请参见python bound and unbound method object)。因为它们也有一个__get__方法,没有staticmethod对象包装函数,functionobj.__get__调用将生成一个方法对象,并传递一个self参数。在

还有一个classmethod,它使用descriptor.__get__的第二个参数将函数绑定到类,然后还有property对象,它们直接将绑定转换为函数调用。见How does the @property decorator work?。在

相关问题 更多 >