2016-06-06 32 views
-1

我想覆蓋使用python 3.4.3的python類的__setattr__方法。我發現this answer,但它似乎不工作,因爲我得到一個錯誤。如何正確調用python3中的默認__setattr__?

完整的代碼如下:

class TestClass(object): 

    def __init__(self): 
     self.x = 4 

    def __setattr__(self, name, value): 
     # do something special given the 'name' 

     #default behavior below 
     super(TestClass).__setattr__(name, value) 

test = TestClass() 

和誤差是

Traceback (most recent call last): 
    File "client_1.py", line 26, in <module> 
    test = TestClass() 
    File "client_1.py", line 17, in __init__ 
    self.x = None 
    File "client_1.py", line 23, in __setattr__ 
    super(TestClass).__setattr__(name, value) 
AttributeError: 'super' object has no attribute 'x' 

我假定屬性,因爲它是尚未定義x不能設置。而行試圖定義這個屬性附加傷害(在__init__)不能定義屬性,因爲它調用覆蓋方法...

如何定義不含蓄調用覆蓋__setattr__方法則屬性x

+1

將您的通話與您鏈接中的通話進行比較。你傳遞了不同的論點。 – user2357112

回答

3

super不需要在Python3參數(至少在覆蓋實例方法的情況下):

super().__setattr__(name, value) 

是Python2的

super(MyClass, self).__setattr__(name, value) 

相當於它仍然有效,但。

+3

切勿將'self .__ class__'傳遞給'super'。如果你創建一個孫類,'self.__ class__'是錯誤的類。 – user2357112

+0

我一定有意無意地用python2調用它。你的建議(和我鏈接的那個)很好...... – Alex

+0

@Alex你沒有把它叫做「Python 2」,你創建了一個超類代理,而不是實例。 – davidism

3

您只是在類中調用超類,在某些情況下它是有效的,但在這種情況下,您希望超類實例。在Python 2中,您可以使用Python 3中的類self來調用它,您可以在不帶參數的情況下調用它。

class Spam: 
    def __setattr__(self, name, value): 
     # super(Spam, self).__setattr__(name, value) # old, but still works 
     super().__setattr__(name, value) # new and cool 

spam = Spam() 
spam.eggs = 'python' # works 
相關問題