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

标签 python decorator static-methods class-method

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

对于 staticmethod,也许我可以保留对原始函数的引用并在调用它时省略第一个参数?

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

同样,我并不是想在我的程序中实际实现它;我想从中学习语言的工作原理。如果可以的话,我真的很感激代码示例。如果没有,我将不胜感激解释为什么它不能在理论上完成。谢谢!

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

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

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

再次感谢!

最佳答案

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

关于python - staticmethod 和 classmethod 装饰器可以用纯 Python 实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11768752/

相关文章:

python - 无法访问 postgresql 表

python - Spacy 模块名称是关键字

python - 可能使用 Python 装饰器或其他重构 : iterative optimization

Python:装饰器特定参数(与包装函数无关)?

java - 在使用它的方法之前初始化一个 util 类是否可以?

java - 将方法更改为静态 - 错误?

java - 为什么 Java 不允许重写静态方法?

python - 我的 Pygame 贪吃蛇游戏陷入了无限循环?

python - python中列表列表的移动平均值

python - 使用 python 装饰器自动替换函数参数默认值?