【发布时间】:2015-03-21 01:10:49
【问题描述】:
你会如何子类化一个装饰类?这是一些代码,我想我一定错过了一些非常简单的东西
def decorator_with_args(*args, **kwargs):
def decorator(cls):
def wrapper(*wargs, **wkwargs):
print("wargs", wargs, wkwargs)
return cls(*wargs, **wkwargs)
return wrapper
return decorator
@decorator_with_args()
class MyClass(object):
def __init__(self, *args, **kwargs):
print("args", args, kwargs)
class MySubClass(MyClass):
pass
myClass = MyClass("arg", kwarg="kwarg")
这将在编译时引发TypeError
Traceback (most recent call last):
File "/path/to/file", line 46, in <module>
class MySubClass(MyClass):
TypeError: function() argument 1 must be code, not str
【问题讨论】:
-
@AshwiniChaudhary 3.4
-
您在这里的预期行为是什么?您是否希望每次初始化
MySubClass的子类时都调用print("wargs", wargs, wkwargs)? -
对于函数
functools.wraps用于将实际函数赋值给装饰器的__wrapped__属性,你可以做类似的事情:wrapper.__wrapped__ = cls然后使用class MySubClass(getattr(MyClass, '__wrapped__', MyClass)):。
标签: python subclass decorator metaclass