实现python元类来改变类级变量

问题描述 投票:1回答:1

你能解释一下,如何实现AFactory类这样做。看来我需要使用元类但是怎么样?我所有的尝试都失败了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'
python python-3.x metaclass
1个回答
2
投票

听起来你真的想要一个班级工厂,而不是一个元类。 (是的,元类也是类工厂,但它们不是唯一的。)所以最简单的解决方案是将AFactory定义为函数:

def AFactory(name):
    class A:
        NAME = name
        VARIABLE = dct[NAME]

    return A

如果你真的需要一个元类,你should implement an alternative constructor而不是试图使元类可以调用为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')
© www.soinside.com 2019 - 2024. All rights reserved.