【发布时间】:2019-06-28 11:26:57
【问题描述】:
我想装饰我班级的所有方法。我在这里写了一个示例小装饰器用于说明目的。
装饰者:
def debug(func):
msg = func.__name__
@wraps(func)
def wrapper(*args, **kwargs):
print(msg)
return func(*args, **kwargs)
return wrapper
def debugmethods(cls):
for key, val in vars(cls).items():
if callable(val):
setattr(cls, key, debug(val))
return cls
现在我想装饰我班级的所有方法。一种简单的方法是在我的课堂上使用@debugmethods 注释,但我试图了解其他两种不同的方法。
a) 覆盖__new__
class Spam:
def __new__(cls, *args, **kwargs):
clsobj = super().__new__(cls)
clsobj = debugmethods(clsobj)
return clsobj
def __init__(self):
pass
def foo(self):
pass
def bar(self):
pass
spam = Spam()
spam.foo()
b) 编写元类
class debugmeta(type):
def __new__(cls, clsname, bases, clsdict):
clsobj = super().__new__(cls, clsname, bases, clsdict)
clsobj = debugmethods(clsobj)
return clsobj
class Spam(metaclass = debugmeta):
def foo(self):
pass
def bar(self):
pass
spam = Spam()
spam.foo()
我不确定
- 为什么“a) 覆盖
__new__”不起作用? - 为什么方法
__new__的签名在元类中不同?
有人可以帮助我了解我在这里缺少什么。
【问题讨论】:
-
元类创建类,类创建实例。
__new__方法签名反映了这一点。 -
有道理。您的意思是说元类中的
__new__方法也被a) 调用?如果是,那么__new__什么时候被调用?谁在调用? -
否,
a)中的__new__被调用以创建Spam类的实例。super().__new__()返回该实例。你那里没有课程。
标签: python metaclass python-internals