Python3 使用 Metaclass 创建在 JSON 文件中定义的 类

Python3 using Metaclass to create classes defined in a JSON file

我目前正在创建一个能够在运行时创建 classes 的程序。我想要的是将 json 文件加载到脚本中,然后从那里创建 classes 并继承 classes。在此文件中,class 名称将以字符串形式出现,这就是为什么我需要一个采用字符串 "A" 并将其转换为 的解决方案class A(metaclass=Metaclass) .我学了一点 metaclasses 并理解了一些,然而,我失败了由于我无法声明 class 的名称,因此无法创建 classes。我通过使用 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 的子classes,但是,我知道我使用了错误的方法并且我的代码无法直接生成子classes的 MetaFoo。所以这是我的三个问题。

  1. 如何使用外部加载的字符串从 Metaclass 创建 classes?不像我那样使用 metaclass type() 因为如果我使用 type() 来创建 classes 就没有必要创建自定义元class。 我需要使用 metaclass 不仅因为它可以让你创建新的 classes 动态的,但因为它提供了许多我需要的功能 我的程序。

  2. 我要处理大数据,可能有数百万行 SQLite3。每行对应一次购买,每个 class 对应一个类别、子类别等。性能方面,有数百万个活动对象,在这种情况下,由 Meta[= 创建的 classes 的实例46=],会减慢程序速度还是根本无法计算?

  3. 我知道如何跟踪通过 metaclass 创建的新 classes,但是我如何跟踪 class 的实例es,具体是哪个魔术方法,应该怎么修改?

感谢您的宝贵时间。

不使用 type,而是直接调用 MetaFoo

globals()[name] = MetaFoo(name, (), {})

Jeff Knupp 提到在他的 sandman library in a post here 中使用元类和数据库做一些类似的事情。您可能想查看他的代码,看看他是否就该主题编写了更多内容。