【问题标题】:How to generate runtime class in python如何在python中生成运行时类
【发布时间】:2019-03-23 12:19:05
【问题描述】:

我想生成一组具有相同方法但不同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__

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    不,你需要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 parameters: namebasesdict 以返回一个新类。

    name 是新类的名称,bases 一个 tuple 包含它的所有基类,dict 一个 dict 键值对表示方法名称和要绑定的实际函数新类应该有的方法。

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

    【讨论】:

      【解决方案2】:

      IIUC,如果您通过__ 预先附加变量名,则在执行它们时,类的名称会自动附加到类的各个变量的开头。所以在通过类实例访问变量时,变量会变成_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')
      

      【讨论】:

      • 不,name 被第 3 方 server.register_handler_class() 使用。我无法改变它。无论如何,谢谢你的伎俩。
      猜你喜欢
      • 1970-01-01
      • 2017-09-22
      • 2016-09-09
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      相关资源
      最近更新 更多