реализация метакласса Python для изменения переменной уровня класса - PullRequest
0 голосов
/ 05 сентября 2018

Можете ли вы объяснить, как реализовать класс 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'

1 Ответ

0 голосов
/ 05 сентября 2018

Похоже, вы действительно хотите фабрику классов, а не метакласс. (Да, метаклассы также являются фабриками классов, но они не единственные.) Поэтому самое простое решение - определить AFactory как функцию:

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

    return A

Если вам действительно нужен метакласс, вам следует реализовать альтернативный конструктор , а не пытаться сделать метакласс вызываемым как 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')
...