【问题标题】:Can the staticmethod and classmethod decoraters be implemented in pure Python?staticmethod 和 classmethod 装饰器可以在纯 Python 中实现吗?
【发布时间】:2012-07-30 21:50:43
【问题描述】:

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

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

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

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

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

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

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

再次感谢!

【问题讨论】:

    标签: python decorator static-methods class-method


    【解决方案1】:

    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
    

    【讨论】:

    • 我会接受这个答案,因为它是对我最初问题的一个很好且完整的答案。但是,如果您也回复我的编辑,我将不胜感激!谢谢!
    【解决方案2】:

    您应该接受 JF Sebastian 的回答,因为它直接回答了您的问题,但是提出这个问题意味着您想了解描述符协议,您可以阅读有关 here 的信息,这是用于实现这些和其他重要的东西Python 内部结构(在您自己的代码中谨慎使用时很有用)。 property 和常规的 ol' 绑定方法是使用描述符协议编写的其他东西。

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

    【讨论】:

      猜你喜欢
      • 2019-08-14
      • 1970-01-01
      • 2011-10-04
      • 2021-03-30
      • 2022-01-21
      • 1970-01-01
      • 2017-04-10
      • 2021-12-01
      • 1970-01-01
      相关资源
      最近更新 更多