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

有人能解释一下staticmethod的源代码是如何在python中工作的吗,python,decorator,static-methods,python-decorators,python-internals,Python,Decorator,Static Methods,Python Decorators,Python Internals,首先,我了解一般来说,一个装饰师是如何工作的。我知道@staticmethod去掉签名中的实例参数,使 class C(object): @staticmethod def foo(): print 'foo' C.foo //<function foo at 0x10efd4050> C().foo //<function foo at 0x10efd4050> C类(对象): @静力学方法 def foo(): 打印“foo”

首先,我了解一般来说,一个装饰师是如何工作的。我知道
@staticmethod
去掉签名中的实例参数,使

class C(object):
    @staticmethod
    def foo():
        print 'foo'
C.foo    //<function foo at 0x10efd4050>
C().foo  //<function foo at 0x10efd4050>
C类(对象):
@静力学方法
def foo():
打印“foo”
C.foo//
C.foo//
有效

然而,我不明白
staticmethod
的sourcec代码是如何实现这一点的

在我看来,当在
staticmethod
中包装方法
foo
时,
staticmethod
的一个实例被实例化,然后一些神奇的事情发生了,使得
C.foo()
合法化

所以。。那些魔法会发生什么?
staticmethod
做了什么

我知道关于
staticmethods
的大量话题,但没有一个能解决我的疑问。但也许我没有找到神奇的关键词。如果是这样,请告诉我


对于寻找
staticmethod
源代码的人,请参阅A
staticmethod
对象是一个。您缺少的神奇之处在于,Python在作为类或实例上的属性访问对象时调用
\uuuu get\uuuu
方法

因此,以
C.foo
的形式访问对象会导致Python将其转换为
C.\uu dict\uuuuuu['foo']。\uuu get\uuuuu(None,C)
,而
instance\u of C.foo
变成
type(instance\u of C)。\uu dict\uuuu['foo']。\uu get\uu(instance\u of C,type(instance\uu of C))

staticmethod
对象是,但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
是原始包装函数

所有这些都是必需的,因为函数本身也是描述符;正是描述符协议为您提供了方法对象(有关更多详细信息,请参阅)。由于它们也有一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


还有一个
classmethod
,它使用
描述符的第二个参数。\uuuu get\uuu
将函数绑定到类,然后还有
属性
对象,它们将绑定直接转换为函数调用。请参阅。

我从PyCharm IDE获得了源代码。。我不知道这是不是真的。。oops@user2829759:PyCharm无法访问实际的源代码(因为它是编译的C代码),因此它会通过自省对象为您重建一个垫片。@MartiInputers它是否反映了C代码中发生的情况?@user2829759:My Python代码版本?绝对地PyCharm反射无法显示方法中发生的情况,它只能推断签名。@user2829759:
\uuu func\uu
属性描述完全错误。它只返回包装好的函数(基本上就像
\uuuu get\uuu
方法一样)。存在的
\uuuu getattribute\uuuuuuuu
\uuuuu new\uuuuuuuuuu
方法只是令人困惑的问题。