如何在__init__中处理对__setattr__的调用?
我写了一个类,用来方便地存储参数,以便后续的序列化处理。这个类重写了 __setattr__
方法,这样可以更方便地访问属性。同时,它还使用一个列表来记住属性添加的顺序,这样在遍历时顺序是可预测且固定的。下面是这个类的代码:
class Parameters(object):
def __init__(self):
self._paramOrder = []
def __setattr__(self, name, value):
self._paramOrder.append(name)
object.__setattr__(self, name, value)
def __delattr__(self, name):
self._paramOrder.remove(name)
object.__delattr__(self, name)
def __iter__(self):
for name in self._paramOrder:
yield self.name
def iteritems(self):
for name in self._paramOrder:
yield name, self.name
现在的问题是,在 __init__
方法中,我调用了我重写的 __setattr__
方法来把 _paramOrder
加入到实例字典里。有没有办法处理这个问题,而不需要在 __setattr__
中添加特殊的处理逻辑呢?
2 个回答
4
在 __init__
里用这一行代码:
object.__setattr__(self, '_paramOrder', [])
12
是的。
可以让它调用 super(Parameters, self).__setattr__()
来代替。
class Parameters(object):
def __init__(self):
super(Parameters, self).__setattr__('paramOrder', [])
# etc.
或者我是不是漏掉了什么?
另一种选择是直接使用 __dict__
class Parameters(object):
def __init__(self):
self.__dict__['paramOrder'] = []
# etc.
这样应该没问题,因为你没有重写 __getattr__
,所以可以直接读取,不会有其他东西干扰。