有人能解释一下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
源代码的人,请参阅Astaticmethod
对象是一个。您缺少的神奇之处在于,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
方法只是令人困惑的问题。