如何在__init__中处理对__setattr__的调用?

12 投票
2 回答
5108 浏览
提问于 2025-04-16 05:04

我写了一个类,用来方便地存储参数,以便后续的序列化处理。这个类重写了 __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__,所以可以直接读取,不会有其他东西干扰。

撰写回答