在一次考试中,教授要求我编写一个对项目中所有类生效的元类,而不直接在类声明中声明它,这可能吗?如何? 例如我有以下代码:
class MetaOne(type):
def __new__(meta, classname, supers, classdict):
print('In MetaOne.new: ', classname, supers, classdict, sep='\n...')
return type.__new__(meta, classname, supers, classdict)
def __init__(Class, classname, supers, classdict):
print('In MetaOne init:', classname, supers, classdict, sep='\n...')
print('...init class object:', list(Class.__dict__.keys()))
class Eggs: pass
print('making class')
class Spam(Eggs):
data = 1
def meth(self, arg): pass
print('making instance')
X = Spam()
print('data:', X.data)
我希望输出等于以下代码的输出:
class MetaOne(type):
def __new__(meta, classname, supers, classdict):
print('In MetaOne.new: ', classname, supers, classdict, sep='\n...')
return type.__new__(meta, classname, supers, classdict)
def __init__(Class, classname, supers, classdict):
print('In MetaOne init:', classname, supers, classdict, sep='\n...')
print('...init class object:', list(Class.__dict__.keys()))
class Eggs: pass
print('making class')
class Spam(Eggs, metaclass=MetaOne):
data = 1
def meth(self, arg): pass
print('making instance')
X = Spam()
print('data:', X.data)
元类将应用于我的所有类,即使我没有直接声明它。 我对元类有很多疑问,但最后都在其类的定义中始终使用 metaclass=meta 声明。
最佳答案
您可以写__metaclass__ = your_metaclass
在模块级别。下面定义的所有类都将使用该元类。如果您写入__metaclass__ = type
,则可以覆盖它再次在类定义中。子类使用父类的元类。
关于python-3.x - 如何将元类应用于我的所有类,而无需在类声明中对其进行硬编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28375792/