请忍受-OOP和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
我希望将此结构设置为嵌套字典,因此已将其添加到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 } }
我只想返回非无的值,并使用我的自定义层次结构存储数据。
我发现这段代码可以很好地满足我的需求。
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,以便它自动执行?
也许我在这里想的都是错的,但是如果有人能指出我正确的方向,那将对我有很大帮助。
答案 0 :(得分:0)
一些额外的信息优先。可以使用vars(object)
或TextBox2.Lines = TextBox1.Lines.
Where(Function(a) Not String.IsNullOrWhiteSpace(a)).
Select(Function(b, i) New With {.n = CInt(b), .idx = i}).
OrderByDescending(Function(c) c.n).
Select(Function(d) CStr(d.idx)).
ToArray()
找到所需的字典表示形式。
object.__dict__
可以通过在类内部实现>>> class Foo:
... def __init__(self, x=None, y=10, z=20):
... self.x = x
... self.y = y
... self.z = z
...
>>> f1 = Foo()
>>> f2 = Foo(1, 2, 3)
>>> vars(f1)
{'x': None, 'y': 10, 'z': 20}
>>> vars(f2)
{'x': 1, 'y': 2, 'z': 3}
>>> f1.__dict__
{'x': None, 'y': 10, 'z': 20}
来控制对象dict
表示的生成。
__setattr__
由于要使用自定义>>> class Foo:
... def __init__(self, x=None, y=10, z=20):
... self.x = x
... self.y = y
... self.z = z
... def __setattr__(self, name, value):
... if value is not None:
... self.__dict__[name] = value
...
>>> f1 = Foo()
>>> f2 = Foo(1, 2, 3)
>>> vars(f1)
{'y': 10, 'z': 20}
>>> vars(f2)
{'x': 1, 'y': 2, 'z': 3}
>>> f1.__dict__
{'y': 10, 'z': 20}
结构,因此可以遍历该类的所有实例变量,如果值不为None,则可以将值添加到dict。
dict