33

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

我知道如何使用classmethodand staticmethod,而且我知道它们是内置函数,但是这样修饰的函数会发生什么?

本质上,我想知道类定义和类构造之间发生的“魔法”。

4

2 回答 2

30

看一下这个。

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”的项目,我确实觉得很有趣。)

于 2011-07-13T20:40:49.913 回答
7

作为参考,来自@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

...

使用非数据描述符协议,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
于 2020-02-24T20:16:03.247 回答