如何在Python中实现方法,`classmethod`和`staticmethod`?

Nei*_*l G 22 python methods class built-in

Python中的方法在什么时候获取get属性? - 一旦他们在课堂上定义了?为什么Python让我定义一个没有任何参数的方法(甚至不是第一个self参数)?

我知道如何使用classmethodstaticmethod,并且我知道它们是内置函数,但是如此装饰的函数会发生什么?

基本上,我想知道类定义和类构造之间发生的"魔力".

JAB*_*JAB 25

看一下这个.

http://docs.python.org/howto/descriptor.html#static-methods-and-class-methods

您还可以在funcobject.c中查看类和静态方法对象的源代码:

http://hg.python.org/cpython/file/69b416cd1727/Objects/funcobject.c

类方法对象定义从第694行开始,而静态方法对象定义从第852行开始.(我确实发现,当methodobject.c也存在时,它们在funcobject.c中有标题为"method"的项目很有趣.)

  • 啊,他们非常善于展示Python实现. (3认同)
  • 谢谢@chepner - 我现在对此更加清楚了,自从提出这个问题以来,Python 已经改变了底层流程,但这是一个很好的思考方式。但有趣的是,我刚刚意识到,提出问题的“Neil G”不是我!难怪我不记得问过这个问题!哈哈:-D (2认同)

Chr*_*rty 5

作为参考,来自@JAB 答案中的第一个链接

使用非数据描述符协议,staticmethod() 的纯 Python 版本将如下所示:

class StaticMethod(object):
    "Emulate PyStaticMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f

    def __get__(self, obj, objtype=None):
        return self.f
Run Code Online (Sandbox Code Playgroud)

...

使用非数据描述符协议,classmethod() 的纯 Python 版本将如下所示:

class ClassMethod(object):
    "Emulate PyClassMethod_Type() in Objects/funcobject.c"

    def __init__(self, f):
        self.f = f

    def __get__(self, obj, klass=None):
        if klass is None:
            klass = type(obj)
        def newfunc(*args):
            return self.f(klass, *args)
        return newfunc
Run Code Online (Sandbox Code Playgroud)