Я хочу иметь класс, который имеет несколько атрибутов. Я хотел бы, чтобы у него также был способ вывести эти атрибуты в виде словаря и пропустить все значения 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! = None в словарь. __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__ кажется правильным способом сделать это. Я очень новичок в ООП, так что это все очень ново для меня. Заранее спасибо!

2
gaxx 7 Окт 2019 в 23:09
Откуда взялись self.price и self.size? Вы хотели написать if self.a is not None and self.b is not None:?
 – 
chepner
7 Окт 2019 в 23:12
Установщик используется, только если вы пишете self._var = ...; на самом деле не имеет смысла возвращать значение.
 – 
chepner
7 Окт 2019 в 23:13
Поменяйте местами использование var и _var. var - название общедоступной собственности; _var - это закрытый атрибут (если есть), который его поддерживает.
 – 
chepner
7 Окт 2019 в 23:13
Извините за опечатку - скопируйте вставку и не увидел этого - означало self.a + self.b
 – 
gaxx
7 Окт 2019 в 23:20

1 ответ

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

@property
def var(self):
    if self.a is not None and self.b is not None:
        return self.a + self.b
1
chepner 7 Окт 2019 в 23:29
Я обновил второй блок кода, потому что, вероятно, возникла путаница. Однако это решение выдает ошибку «AttributeError: невозможно установить атрибут». Если я удалю var из __init__, он компилируется, но не выводит значение в словарь (используя __dict__)
 – 
gaxx
8 Окт 2019 в 00:02