如何处理__init__对__setattr__的调用?

时间:2010-10-06 09:07:35

标签: python

我编写了一个类,用于以便捷的方式存储参数进行酸洗。它会重载__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 个答案:

答案 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', [])