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。所以这是我的三个问题。
如何使用外部加载的字符串从 Metaclass 创建 classes?不像我那样使用 metaclass type() 因为如果我使用 type() 来创建 classes 就没有必要创建自定义元class。
我需要使用 metaclass 不仅因为它可以让你创建新的 classes
动态的,但因为它提供了许多我需要的功能
我的程序。
我要处理大数据,可能有数百万行 SQLite3。每行对应一次购买,每个 class 对应一个类别、子类别等。性能方面,有数百万个活动对象,在这种情况下,由 Meta[= 创建的 classes 的实例46=],会减慢程序速度还是根本无法计算?
我知道如何跟踪通过 metaclass 创建的新 classes,但是我如何跟踪 class 的实例es,具体是哪个魔术方法,应该怎么修改?
感谢您的宝贵时间。
我目前正在创建一个能够在运行时创建 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。所以这是我的三个问题。
如何使用外部加载的字符串从 Metaclass 创建 classes?不像我那样使用 metaclass type() 因为如果我使用 type() 来创建 classes 就没有必要创建自定义元class。 我需要使用 metaclass 不仅因为它可以让你创建新的 classes 动态的,但因为它提供了许多我需要的功能 我的程序。
我要处理大数据,可能有数百万行 SQLite3。每行对应一次购买,每个 class 对应一个类别、子类别等。性能方面,有数百万个活动对象,在这种情况下,由 Meta[= 创建的 classes 的实例46=],会减慢程序速度还是根本无法计算?
我知道如何跟踪通过 metaclass 创建的新 classes,但是我如何跟踪 class 的实例es,具体是哪个魔术方法,应该怎么修改?
感谢您的宝贵时间。