2010-10-06 16 views
7

我已經編寫了一個類,用於酸洗方便的存儲參數。它超載__setattr__以方便訪問。它還使用一個列表記住添加的屬性的順序,以便迭代順序可預測並保持不變。那就是:如何處理__init__對__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__叫我爲了給_paramOrder添加到實例字典超載__setattr__。有沒有辦法處理這個問題,而不需要增加一個特殊的例子到__setattr__

回答

7

是的。

改爲撥打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__,所以你可以閱讀它沒有任何的方式獲得。

+0

我這樣做的權利,但我仍然需要一個特殊的情況,因爲否則的名字'_paramOrder'將被添加到'_paramOrder'。 – 2010-10-06 09:11:34

+0

這不是你展示的代碼。這應該繞過參數的__setattr__方法。 – aaronasterling 2010-10-06 09:13:21

+0

你說得對。我誤解了,但現在我明白了。 – 2010-10-06 09:14:46

3

使用此行__init__代替:

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