这是一个学术问题,而不是一个实际问题。我正在尝试深入研究 Python 的基础,我想知道:如果我愿意,我可以在纯 Python 中实现 staticmethod
和 classmethod
装饰器吗?
对于 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/