考虑以下代码:
def print_name(*args, **kwargs):
cls = type(*args, **kwargs)
print "hello " + cls.name
return type.__new__( *args, **kwargs)
class B(object):
__metaclass__ = print_name
name = 'animal'
class C(B):
name = "zebra"
class D(B):
name = "pig"
我试图实现的是在B子类(C和D)上调用函数print\u name,并使其打印静态属性name。所以期望的输出应该是这样的-
animal
zebra
pig
非常感谢!你知道吗
在
print_name()
函数中,应该替换以下内容:有了这个:
这样你就可以摆脱你看到的
TypeError
。你知道吗发生错误是因为
__new__
的第一个参数必须是类型对象。对__new__
的正确调用是:type.__new__(type, *args, **kwargs)
,但是在您的例子中,实际上不需要创建两次类。你知道吗现在,即使使用此修复程序,您也不会在输出中看到“zebra”和“pig”,因为您直接从
type
生成类B
,因此元类信息丢失。你知道吗你应该这样考虑:
这样,
B
及其所有子类都将是print_name
类型,并且每次创建子类时,您的代码都将正确执行。你知道吗(顺便说一句,元类可能导致无法使用多重继承,因此请仔细考虑是否确实需要它们。)
相关问题 更多 >
编程相关推荐