Как вывести класс как вложенный словарь с атрибутами, рассчитанными, если другие атрибуты есть! = Нет - PullRequest
2 голосов
/ 07 октября 2019

Я хочу иметь класс с несколькими атрибутами. Я хотел бы, чтобы у него также был способ вывести эти атрибуты в виде словаря и пропустить все значения None. Также в идеальном сценарии я бы хотел, чтобы этот dict был вложенным, но обо всем по порядку:

class MyClass():
    def __init__(self, a=False, b=None, c=None, ...):
        self.a = a
        self.b = b
        self.c = c
        ...

    @property
        def dictionary(self):
            dictionary = { k:v for k, v in self.__dict__.items() if v != None }
        return dictionary


Это работает нормально, однако проблема в том, что при попытке включить результат из self.a + self.b if! = Нет в словаре. __dict__ выводит только те значения, которые являются частью __init__. Я попытался решить эту проблему с помощью дополнительного атрибута, а затем с помощью setter:

class MyClass():
    def __init__(self, a=False, b=None, c=None, ... , _var=None):
        self.a = a
        self.b = b
        self.c = c
        ...
        self.var = None

    @property
    def _var(self):
        _var = None
        return self.var

    @_var.setter
    def _var(self):
        if self.a & self.b != None:
            self.var = self.a + self.b
            return self.var

    @property
        def dictionary(self):
            dictionary = { k:v for k, v in self.__dict__.items() if v != None }
        return dictionary

К сожалению, это не инициализируется при создании экземпляра. Можно ли это сделать? Я думаю, что выгляжу неправильно, но как-то __dict__ кажется правильным способом сделать это. Я очень новичок в ООП, так что это все очень ново для меня. Заранее спасибо!

1 Ответ

1 голос
/ 07 октября 2019

Кажется, что нет необходимости в сеттере;просто укажите свое состояние в самом геттере:

@property
def var(self):
    if self.a is not None and self.b is not None:
        return self.a + self.b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...