Python 3.x 如何将元类应用于我的所有类,而不在类声明中硬编码它
为了考试,教授让我写一个元类,在项目中的所有类上生效,而不直接在类声明中声明它,这是可能的吗?怎样? 例如,我有以下代码:Python 3.x 如何将元类应用于我的所有类,而不在类声明中硬编码它,python-3.x,Python 3.x,为了考试,教授让我写一个元类,在项目中的所有类上生效,而不直接在类声明中声明它,这是可能的吗?怎样? 例如,我有以下代码: class MetaOne(type): def __new__(meta, classname, supers, classdict): print('In MetaOne.new: ', classname, supers, classdict, sep='\n...') return type.__new__(meta, c
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)
我希望输出等于以下代码的输出:
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)
元类将应用于我的所有类,即使我没有直接声明它。
我有很多关于元类的问题,但最后在他们的类定义中总是使用元类=元声明。好吧,我很难理解你的问题 如果
Eggs
继承MetaOne
和Spam
继承Eggs
,这是否完成了您要做的事情
示例#1:
示例2:
您可能会用到网站上提供的信息,尤其是前面链接中的以下代码块:
class FilterClass(type):
@classmethod
def __prepare__(name, bases, **kwds):
return collections.OrderedDict()
def __new__(metacls, name, bases, namespace, **kwds):
result = type.__new__(metacls, name, bases, dict(namespace))
result._filters = [
value for value in namespace.values() if hasattr(value, '_filter')]
return result
这段代码演示了如何在不使用metaclass=ABCMeta
的情况下创建元类
示例#3:
您是否熟悉super()
在这个用例中,
Spam
、Scrambled
和Fried
的元类都将是MetaOne您可以在模块级编写\uuuuuuuu元类=您的\uu元类
。下面定义的所有类都将使用该元类。如果在类定义中再次编写\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu=type
,则可以覆盖此项。子类正在使用父类的元类。Eggs不继承MetaOneYes,在您的代码中不继承。如果是这样,Spam
只需要继承Eggs
,问题是让元类工作,而不在类声明中写入metaclass=ABCMeta谢谢,这个答案很好,现在我试图解决我的考试,然后我告诉你我使用了哪种方法。
class MetaOne: pass
class Eggs: pass
__metaclass__ = MetaOne
class Spam: pass
class Scrambled: pass
class Fried: pass