Как указать атрибуты класса Python с аргументами ключевого слова конструктора - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь найти способ, позволяющий задавать любое количество атрибутов класса при создании экземпляра, очень похожий на словарь. Идеальный вариант использования:

>>> instance = BlankStruct(spam=0, eggs=1)
>>> instance.spam
0
>>> instance.eggs
1

где BlankStruct определяется как:

class BlankStruct(Specifiable):
    @Specifiable.specifiable
    def __init__(self, **kwargs):
        pass

Я думал об использовании декоратора родительского класса, но теряюсь в мысли о том, использовать ли методы экземпляра, методы класса или статические методы (или, возможно, ничего из вышеперечисленного!). Это лучшее, что я придумал до сих пор, но проблема в том, что атрибуты применяются к классу, а не к экземпляру:

class Specifiable:
    @classmethod
    def specifiable(cls, constructor):
        def constructor_wrapper(*args, **kwargs):
            constructor(*args, **kwargs)
            cls.set_attrs(**kwargs)
        return constructor_wrapper

    @classmethod
    def set_attrs(cls, **kwargs):
        for key in kwargs:
            setattr(cls, key, kwargs[key])

Как я могу создать такой родительский класс?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Я считаю, что вы можете сделать это без декораторов:

class Specifiable:

  def __init__(self, **kwargs):
    for key, value in kwargs.items():
      setattr(self, key, value)


class BlankStruct(Specifiable):

  def __init__(self, **kwargs):
    super().__init__(**kwargs)
    # Do other stuff.
0 голосов
/ 31 октября 2018

Да, вы можете сделать следующее, однако я НЕ рекомендую, поскольку это явно противоречит принципу , который лучше, чем неявный :

class BlankStruct:

    def __init__(self, **attrs):
        self.__dict__.update(**attrs)
    def __getattr__(self, attr):
        return self.__dict__.get(attr, None)

f = BlankStruct(spam=0, eggs=1)

Более полный ответ доступен здесь и вдохновил этот ответ.

Я бы рекомендовал быть явным с точки зрения свойств, которые вы хотите, чтобы ваш класс имел. В противном случае у вас останется класс с высокой степенью изменчивости, что, вероятно, снижает его полезность.

...