关于python:python3使用元类创建JSON文件中定义的类

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行。每一行对应一个采购,每一类对应一个类别、子类别等。从性能上讲,?在这种情况下,是否有数百万个活动对象(元类创建的类实例)会减慢程序运行速度,或者根本无法计算?

  • 我知道如何跟踪通过元类创建的新类,但是?如何跟踪类的实例、哪种魔力方法以及如何修改它?

  • 谢谢你抽出时间。


    不使用type,直接调用MetaFoo

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

    JeffKnupp在本文中提到了为他的sandman库做类似于元类和数据库的事情。你可能想看看他的代码,看看他是否写了更多关于这个主题的文章。