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

问题描述 投票:1回答:1

我目前正在创建一个能够在运行时创建类的程序。我想要的是将一个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的子类。所以这是我的三个问题。

  1. 如何使用外部加载的字符串从Metaclass创建类?不像我那样使用元类型(),因为如果我使用type()来创建类,那么就没有必要创建自定义元类。我需要使用元类不仅因为它允许你在dinamically创建新类,但因为它提供了许多功能,就像我在程序中需要的那样。
  2. 我将处理大数据,可能是数百万条SQLite3线。每一行对应一次购买,每一类对应一个类别,子类别等。性能明智,¿有数百万个活动对象,在这种情况下,是由Metaclass创建的类的实例,会使程序变慢或无法运行要计算?
  3. 我知道如何跟踪通过元类创建的新类,但是如何跟踪类的实例,哪种魔术方法以及如何修改它?

感谢您的时间。

python json python-3.x metaprogramming metaclass
1个回答
1
投票

而不是使用type,直接致电MetaFoo

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

Jeff Knupp提到在sandman后的here库中为类和数据库做类似的事情。你可能想看看他的代码,看看他是否在这个主题上写了更多。

© www.soinside.com 2019 - 2024. All rights reserved.