如何处理__init__对__setattr__的调用?

Bjö*_*lex 11 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
Run Code Online (Sandbox Code Playgroud)

问题是__init__调用我的重载__setattr__以便添加_paramOrder到实例字典.有没有办法处理这个而不添加特殊情况__setattr__

aar*_*ing 11

是.

让它打电话super(Parameters, self).__setattr__().

class Parameters(object):
    def __init__(self):
        super(Parameters, self).__setattr__('paramOrder', [])

    # etc.
Run Code Online (Sandbox Code Playgroud)

或者我错过了什么?

另一种选择是直接去 __dict__

class Parameters(object):
    def __init__(self):
        self.__dict__['paramOrder'] = []

    # etc.
Run Code Online (Sandbox Code Playgroud)

这应该有效,因为你没有压倒性的,__getattr__所以你可以在没有任何妨碍的情况下阅读它.