如何将方法集成到类中?

时间:2019-10-08 11:43:31

标签: python python-3.x oop

请忍受-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,以便它自动执行?

也许我在这里想的都是错的,但是如果有人能指出我正确的方向,那将对我有很大帮助。

1 个答案:

答案 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