2012-06-21 76 views
2

會遞歸我已經中下列方式__getattr__在python

class A: 
    def __init__(self, list_1, list_2): 
     self.list1 = list_1 
     self.list2 = list_2 

    def __getattr__(self, item): 
     if item in self.list1: return "It is in list 1" 
     elif item in self.list2: return "It is in list 2" 
     else: return "It is in neither list 1 nor list 2" 

這裏的時候,我加入__setattr__self.list 1變爲遞歸,因爲__getattr__讓每一個self.list1後調用這個遞歸是不可阻擋的聲明的類。你能幫我解決嗎?我需要像這樣實施。

感謝

+4

你提到'__setattr__'但它不是在你的代碼。如果你是,請解釋你如何使用'__setattr__'。 – BrenBarn

+1

嘗試在'__getattr __()'的開頭添加如下內容:'if item in [「list1」,「list2」]:return self .__ dict __ [item]'。 –

回答

5

首先,這是__getattr__完全離奇的用法,但我會假設你知道。

基本上,問題是,__setattr__總是叫你每次做這樣的事情self.foo = bar時間,因此,如果您使用內__setattr__你會,你有遞歸結束。您需要做的是將您要設置的值直接插入__dict__self.__dict__['foo'] = bar

如果您使用新式類(即Aobject後裔),那麼你也可以做super(A, self).__setattr__(item, value)甚至只是object.__setattr__(self, item, value)

相關問題