staticmethod和classmethod装饰器可以用纯Python实现吗?

Tom*_*Tom 10 python static-methods decorator class-method

这是一个学术问题,不仅仅是一个实际问题.我正在尝试深入研究Python的基础,我想知道:如果我愿意,我可以在纯Python中实现staticmethodclassmethod装饰器吗?

对于staticmethod也许我可以保持一个参照原有的功能,并调用它省略了第一个参数?

对于classmethod也许我可以保持一个参照原有的功能,并把它传递的第一个参数的类型,而不是争论本身?(我怎么处理它直接在课堂上调用?)

同样,并不是我想在我的程序中实际实现它; 我想学习语言是如何运作的.如果有可能,我会非常感谢代码示例.如果没有,我希望解释为什么理论上无法做到.谢谢!

编辑:感谢您的答案和描述符协议的参考!作为进一步扩展我对Python的理解的一种方法,我想再问两件事:

  • 这可以在没有描述符协议的情况下完成,例如在我们的类中实现__ call __特殊方法吗?

  • 描述符协议在Python 2.7和Python 3.x中的工作方式是否相同?

再次感谢!

jfs*_*jfs 12

文档中有一些示例:

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)

和:

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)