meta class 不会被继承
meta class doesn't get inherited
在下面的代码中:
class Meta(type):
def __new__(cls, name, bases, attrs):
print(name)
return type(name, bases, attrs)
class A(object, metaclass=Meta):
def do_complex_task(self):
pass
class B(A):
def do_minor_task(self):
pass
我希望看到 A
和 B
都打印出来,但我看到元 class 仅应用于 A
。我该如何解决这个问题?我的目标是预处理 A
的所有子项的字段,并且我想省略在每个子项中键入 metaclass=Meta
。
您的元类实际上不是 Meta
。如果你这样做 type(a)
,你会得到 <class 'type'>
,因为你将 Meta.__new__
覆盖为 return 一个普通的 type
,而不是 Meta
实例。
一般来说,与普通 类 一样,对于 meta类,您希望覆盖 __init__
并让 __new__
执行默认操作。
class Meta(type):
def __init__(self, name, supers, attrs):
print(name)
然后您将根据需要看到 A
和 B
被打印出来。
因为你 return type(name, bases, attrs)
你得到一个类型 type
而不是 Meta
的对象。您可以通过打印 A.__class__
来检查这一点。相反,你应该 return:
return super().__new__(cls, name, bases, attrs)
在下面的代码中:
class Meta(type):
def __new__(cls, name, bases, attrs):
print(name)
return type(name, bases, attrs)
class A(object, metaclass=Meta):
def do_complex_task(self):
pass
class B(A):
def do_minor_task(self):
pass
我希望看到 A
和 B
都打印出来,但我看到元 class 仅应用于 A
。我该如何解决这个问题?我的目标是预处理 A
的所有子项的字段,并且我想省略在每个子项中键入 metaclass=Meta
。
您的元类实际上不是 Meta
。如果你这样做 type(a)
,你会得到 <class 'type'>
,因为你将 Meta.__new__
覆盖为 return 一个普通的 type
,而不是 Meta
实例。
一般来说,与普通 类 一样,对于 meta类,您希望覆盖 __init__
并让 __new__
执行默认操作。
class Meta(type):
def __init__(self, name, supers, attrs):
print(name)
然后您将根据需要看到 A
和 B
被打印出来。
因为你 return type(name, bases, attrs)
你得到一个类型 type
而不是 Meta
的对象。您可以通过打印 A.__class__
来检查这一点。相反,你应该 return:
return super().__new__(cls, name, bases, attrs)