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