我编写了一个类,用于以便捷的方式存储参数进行酸洗。它会重载__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__
添加特殊情况?
答案 0 :(得分:9)
是
让它改为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__
所以你可以在没有任何妨碍的情况下阅读它。
答案 1 :(得分:4)
请在__init__
中使用此行代替:
object.__setattr__(self, '_paramOrder', [])