Пожалуйста, потерпите меня - ООП и Python являются для меня очень новыми вещами.
У меня есть класс, который выглядит так:
class Offer():
def __init__(self, active=False, kind=None, added=None,
area=None, city=None, street=None, coords=None, phone=None,
size=None, ... many more attributes
):
self.active = active
self.added = added
self.kind = kind
self.area = area
self.city = city
self.street = street
self.coords = coords
self.phone = phone
self.size = size
...
many more attributes
Я хотел бы иметь эту структурукак вложенный dict, поэтому я добавил это в Offer ()
# continue of previous block
@property
def dictionary(self):
d = {
'active' : self.active,
'added' : self.added,
'kind' : self.kind,
'address' : {
'area' : self.area,
'city' : self.city,
'street' : self.street,
'coords' : self.coords
},
'params' : {
'size' : self.size,
'phone' : self.phone,
}
...
many more nested dict
return d
Я хочу, чтобы пользователь использовал этот класс следующим образом:
>>> a = Offer(active=True, added=12.11.19, kind="kind", city="some city", street="some street", phone=123456789)
>>> print(a.dictionary)
{ 'active' : True, 'added' : 12.11.19, 'kind' : "kind", 'address' : { 'city' : "some city", 'street' : "some street" }, 'params' : { 'phone' : 123456789 } }
Я хочучтобы возвращать только те значения, которые не None и использовать мою пользовательскую иерархию для данных.
Я обнаружил, что этот фрагмент кода, который прекрасно работает для того, что мне нужно.
a = Offer(phone=123456789, size=50, city="city", kind='kind')
def remove_none(obj):
if isinstance(obj, (list, tuple, set)):
return type(obj)(remove_none(x) for x in obj if x is not None)
elif isinstance(obj, dict):
return type(obj)((remove_none(k), remove_none(v))
for k, v in obj.items() if k is not None and v is not None)
else:
return obj
print(remove_none(a.dictionary))
Мой вопрос: как мне интегрировать remove_none с @property, чтобы он выполнялся автоматически?
Может быть, я здесь все не так, но если кто-то может указать мнев правильном направлении, это очень помогло бы мне.