我想生成一组具有相同方法但具有不同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__
?
答案 0 :(得分:2)
否,您需要type
和globals
:
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:name
,bases
和dict
返回一个新类。
name
是新类的名称,bases
和tuple
包含其所有基类,而dict
和dict
的键值对表示方法名称和实际函数将被绑定为新类应具有的方法。
然后,当然,要以编程方式将它们添加到全局名称空间,我们可以通过调用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')