2014-04-25 31 views
0

我有別人做了一個類A,我不能編輯:Python重寫setter到一個沒有setter的屬性?

class A: 
    def __init__(self, x): 
     self.x = x 

現在,我試圖從A繼承我自己的類B,並有x的屬性,而不是一個屬性。 這可能嗎?

我已經嘗試過:

class B(A): 
    def __init__(self, x): 
     super().__init__(x) 

    @property 
    def x(self): 
     return super().x 

    @x.setter 
    def x(self, x): 
     super().x = x 
     print(x) # my stuff goes here 

但正如我所料,這是不可能的:AttributeError: 'super' object has no attribute 'x'

是否有其他方法,一些workaroud也許?

回答

1

不,您不能將super()用於除屬性類以外的其他任何內容; x實例屬性,並且沒有屬性的繼承機制。

實例屬性存在於單個命名空間中;沒有'父實例'屬性名稱空間。

您仍然可以在背景__dict__對象達到屬性:

class B(A): 
    @property 
    def x(self): 
     return self.__dict__['x'] 

    @x.setter 
    def x(self, x): 
     self.__dict__['x'] = x 
     print(x) # my stuff goes here 

屬性是一個數據描述符,這意味着它是之前的實例屬性協商擡頭(參見descriptor howto)但您仍然可以直接訪問它。

+0

感謝您的回答,我會盡快接受。 :)可能有點「黑客」的方式(好吧,至少看起來有點哈克來訪問'__dict__'),但似乎工作很棒 –