Python3 using Metaclass to create classes defined in a JSON file
我目前正在创建一个能够在运行时创建类的程序。我想要的是将JSON文件加载到脚本中,然后从脚本中创建类和继承类。在这个文件中,类名将以字符串的形式出现,这就是为什么我需要一个解决方案,它接受一个字符串"a"并将其转换为类A(元类=元类)。我已经学习了一些元类并理解其中的一些内容,但是,由于我无法声明类的名称,我未能创建类。我用globals()找到了一个笨拙的解决方案。然而,我想知道是否有更多的Python解决方案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class MetaFoo(type): def __new__(cls,name,bases,attr): print(f"{name} is invoking {cls.__name__}") return super().__new__(cls,name,bases,attr) def creator(name,bases,attr): globals()[name] = type(name,bases,attr) class Foo(metaclass=MetaFoo): pass class SubFoo1(Foo): pass class SubFoo2(Foo): pass class InheritFoo(SubFoo1,SubFoo2): pass print("-"*30) MetaFoo.creator("Z",(Foo,),{}) |
输出将是:
1 2 3 4 5 6 | Foo is invoking MetaFoo SubFoo1 is invoking MetaFoo SubFoo2 is invoking MetaFoo InheritFoo is invoking MetaFoo ------------------------------ Z is invoking MetaFoo |
现在我可以用creator()创建foo的子类,但是我知道我的方法不对,我的代码不能直接生成metafoo的子类。这是我的三个问题。
如何使用外部加载的字符串从元类创建类?不像我那样使用元类类型(),因为如果我使用类型()创建类,就没有创建自定义元类的意义。我需要使用元类,不仅因为它可以创建新类一般来说,但因为它提供了许多我需要的功能我的程序。
我将要处理大数据,可能有数百万条sqlite3行。每一行对应一个采购,每一类对应一个类别、子类别等。从性能上讲,?在这种情况下,是否有数百万个活动对象(元类创建的类实例)会减慢程序运行速度,或者根本无法计算?
我知道如何跟踪通过元类创建的新类,但是?如何跟踪类的实例、哪种魔力方法以及如何修改它?
谢谢你抽出时间。
不使用
1 | globals()[name] = MetaFoo(name, (), {}) |
JeffKnupp在本文中提到了为他的