如何在python中生成运行时类

时间:2019-03-23 12:19:06

标签: python python-3.x

我想生成一组具有相同方法但具有不同name属性的类。例如,

class A:
    name = '1'
    def f(self):
        print('call')

class B
    name = '2'
    def f(self):
        print('call')

class C
    name = '3'
    def f(self):
        print('call')

server.register_handler_class(A)
server.register_handler_class(B)
server.register_handler_class(C)

name文件中加载xx.conf的值。 这该怎么做?我需要metaclass还是__new__

2 个答案:

答案 0 :(得分:2)

否,您需要typeglobals

new_class_names = ['A', 'B', 'C']

def new_class_init(self):
    print(f'{self} was called.')

for class_name in new_class_names:
    globals()[class_name] = type(class_name, (), {'__init__': new_class_init}

type可以是called with three parametersnamebasesdict返回一个新类。

name是新类的名称,basestuple包含其所有基类,而dictdict的键值对表示方法名称和实际函数将被绑定为新类应具有的方法。

然后,当然,要以编程方式将它们添加到全局名称空间,我们可以通过调用dict来引用全局globals

答案 1 :(得分:0)

IIUC,如果在执行变量时用__预先添加了变量名,则该类的名称将自动附加到该类的各个变量的开头。因此,在通过Class实例访问变量时,变量将变为_A__name_B__name_C__name。这使您可以使用相同的名称,而不会遇到名称冲突的问题。您可以阅读我的答案here。我不确定这是否是您的意思。

同样可以对方法进行操作:__f

因此您可以使用

class A:
    __name = '1'
    def f(self):
        print('call')

class B
    __name = '2'
    def f(self):
        print('call')

class C
    __name = '3'
    def f(self):
        print('call')