实施 python metaclass 以更改 class 级别变量
implementing python metaclass for changing class level variable
你能解释一下,如何实现 AFactory
class 来做到这一点吗?看来我需要使用 metaclass 但是如何呢?我所有的尝试都失败了 KeyError
dct = {
'key1': 'value1',
'key2': 'value2'
}
class AFactory:
pass
class A:
NAME = ''
VARIABLE = dct[NAME]
A1 = AFactory('key1')
a1 = A1()
assert a1.NAME == 'key1'
assert a1.VARIABLE == 'value1'
A2 = AFactory('key2')
a2 = A2()
assert a2.NAME == 'key2'
assert a2.VARIABLE == 'value2'
听起来你真的想要一个 class 工厂,而不是元class。 (是的,metaclasses 也是 class 工厂,但它们不是唯一的工厂。)所以最简单的解决方案是将 AFactory
定义为函数:
def AFactory(name):
class A:
NAME = name
VARIABLE = dct[NAME]
return A
如果你真的需要一个元class,你而不是试图让元class可调用为AFactory(name)
:
class AFactory(type):
@classmethod
def make(mcs, name):
clsname = 'A'
bases = ()
attrs = {
'NAME': name,
'VARIABLE': dct[name]
}
return mcs(clsname, bases, attrs)
你可以像这样使用
A1 = AFactory.make('key1')
你能解释一下,如何实现 AFactory
class 来做到这一点吗?看来我需要使用 metaclass 但是如何呢?我所有的尝试都失败了 KeyError
dct = {
'key1': 'value1',
'key2': 'value2'
}
class AFactory:
pass
class A:
NAME = ''
VARIABLE = dct[NAME]
A1 = AFactory('key1')
a1 = A1()
assert a1.NAME == 'key1'
assert a1.VARIABLE == 'value1'
A2 = AFactory('key2')
a2 = A2()
assert a2.NAME == 'key2'
assert a2.VARIABLE == 'value2'
听起来你真的想要一个 class 工厂,而不是元class。 (是的,metaclasses 也是 class 工厂,但它们不是唯一的工厂。)所以最简单的解决方案是将 AFactory
定义为函数:
def AFactory(name):
class A:
NAME = name
VARIABLE = dct[NAME]
return A
如果你真的需要一个元class,你AFactory(name)
:
class AFactory(type):
@classmethod
def make(mcs, name):
clsname = 'A'
bases = ()
attrs = {
'NAME': name,
'VARIABLE': dct[name]
}
return mcs(clsname, bases, attrs)
你可以像这样使用
A1 = AFactory.make('key1')