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, 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/

相关文章:

python - 值错误 : could not convert string tofloat. 为什么? (Python)

python - SQLAlchemy 文本函数是否暴露于 SQL 注入(inject)?

python - 使用您自己的模块时有关硬编码变量的最佳实践问题

python - 如何使用OpenCV单击或按下键盘上的任意键来捕获视频并从网络摄像头保存

python - Csv 文件并为字典提供某些键

python - 使用 Python 进行 Web 抓取 - 忽略重复属性错误

带有异步 def 的 python asyncio add_done_callback

python - 将html解析为文本并在python中保留链接

python - PySide2 在设计师创建的小部件上绘制

python - 我需要使用有关 Django 程序中的 where 条件的 sql 语句的帮助