我没有回答您所问的问题,但是下面展示了一个等价于classmethod,用纯Python编写的decorator,因为源代码中的一个是用C编写的,位于{a1}中,正如Mishna在他的答案中所说的那样。在
因此,类方法的思想是使用“描述符”机制,如Python's data model-中所述,并使__get__方法返回一个函数对象,该对象在被调用时将调用原始方法,并预先填充第一个参数:class myclassmethod(object):
def __init__(self, method):
self.method = method
def __get__(self, instance, cls):
return lambda *args, **kw: self.method(cls, *args, **kw)
在Python控制台上:
^{pr2}$
*编辑-更新*
O.p.进一步问:“如果我希望decorator也接受一个参数,init的正确格式是什么?”-在
在这种情况下,不仅仅是__init__需要更改——接受配置参数的装饰器实际上是在“两个阶段”中被调用的——第一个阶段对参数进行了注释,并返回一个可调用的函数——第二个调用只接受实际将被修饰的函数。在
有几种方法可以实现这一点,但我认为最简单的方法是使用一个返回上述类的函数,如:def myclasmethod(par1, par2, ...):
class _myclassmethod(object):
def __init__(self, method):
self.method = method
def __get__(self, instance, cls):
# make use of par1, par2,... variables here at will
return lambda *args, **kw: self.method(cls, *args, **kw)
return _myclassmethod