【发布时间】:2013-06-14 03:36:45
【问题描述】:
我有兴趣将实例方法作为类方法和实例方法来调用。这可以通过使用 class_or_instance 装饰器来完成,如下所示:
class class_or_instance(object):
def __init__(self, fn):
self.fn = fn
def __get__(self, obj, cls):
if obj is not None:
return lambda *args, **kwds: self.fn(obj, *args, **kwds)
else:
return lambda *args, **kwds: self.fn(cls, *args, **kwds)
class A(object):
@class_or_instance
def func1(self,*args):
# method body
现在我可以将 func1 称为 A.func1(*args) 或A().func1(*args)。
然而,当这样做时,func1 的文档字符串消失了。解决这个问题的一种方法是使用来自decorator.py 的装饰器,但我无法让它与作为类而不是函数的装饰器一起使用。有什么建议可以解决这个问题吗?
编辑:functools.wraps() 在这种情况下将无法正常工作。请参阅 stackoverflow 上的 related question
【问题讨论】:
-
为什么不使用@classmethod 或@staticmethod?
-
@classmethod 只允许它作为类方法运行。我希望能够将其称为类或实例方法
-
如果在实例上调用类方法,第一个参数不是对实例的引用(“self”),而是对它的类(“cls”)的引用。与静态方法的唯一区别是缺少第一个“cls”参数,但除此之外它们的行为相同。
标签: python oop decorator docstring