开发者

How to handle call to __setattr__ from __init__?

开发者 https://www.devze.com 2023-01-19 02:06 出处:网络
I have written a class that will be used to store parameters in a convenient way for pickling. It overloads __setattr__ for convenient access. It also uses 开发者_如何转开发a list to remember the orde

I have written a class that will be used to store parameters in a convenient way for pickling. It overloads __setattr__ for convenient access. It also uses 开发者_如何转开发a list to remember the order in which attributes where added, so that the iteration order is predictable and constant. Here it is:

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

The problem is that __init__ calls my overloaded __setattr__ in order to add the _paramOrder to the instance dictionary. Is there a way to handle this without adding a special case to __setattr__?


yes.

have it call super(Parameters, self).__setattr__() instead.

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

    # etc.

Or am I missing something?

Another alternative is to just go straight to __dict__

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

    # etc.

This should work because you are not overriding __getattr__ so you can read it without anything getting in the way.


Use this line in __init__ instead:

object.__setattr__(self, '_paramOrder', [])
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号