我目前正在创建一个能够在运行时创建类的程序。我想要的是将一个json文件加载到脚本中,然后从那里创建类和继承的类。在这个文件中,类名将作为字符串出现,这就是为什么我需要一个采用字符串“A”并将其转换为类A(metaclass = Metaclass)的解决方案。我已经学习了一些元类并了解其中的一些,但是,由于我无法声明类的名称,因此无法创建类。通过使用globals(),我找到了一个笨拙的解决方案。但是,我想知道是否有更多的pythonic解决方案。
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,),{})
输出将是:
Foo is invoking MetaFoo
SubFoo1 is invoking MetaFoo
SubFoo2 is invoking MetaFoo
InheritFoo is invoking MetaFoo
------------------------------
Z is invoking MetaFoo
现在我可以使用creator()创建Foo的子类,但是,我知道我的方法错误,而且我的代码无法直接生成MetaFoo的子类。所以这是我的三个问题。
感谢您的时间。