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

时间:2012-08-01 22:54:49

标签: python decorator static-methods class-method

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

对于staticmethod,也许我可以保留对原始函数的引用并将其称为省略第一个参数?

对于classmethod也许我可以保留对原始函数的引用并调用它传递第一个参数的类型,而不是参数本身? (我如何处理它直接在课堂上调用?)

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

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

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

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

再次感谢!

2 个答案:

答案 0 :(得分:12)

the docs中有一些例子:

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

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

答案 1 :(得分:1)

你应该接受JF Sebastian的回答,因为它直接回答你的问题,但是问这个问题意味着你想知道关于here可以阅读的描述符协议,这是用来实现这些和其他重要的Python内部(当你谨慎使用时,可以在你自己的代码中使用)。 property和常规ol'绑定方法是使用描述符协议编写的其他内容。

你应该检查出来,当你第一次阅读它时并不是那么简单,但它会点击。