2015-09-26 198 views
0

我真的很奇怪的問題。我寫了一堂課,然後我想修改她一下。我改變了一些東西,現在:無法賦值給對象的屬性

class Window (Drawable): 
__width = 0 

def __init__(self, intext="", intitle="", inwidth=50, inheight=10, startpos=Position()): 
    self.__width = inwidth 
    print inwidth 
    print self.__width 

我正在使用此代碼來呈現我的問題。每當我使用這個類創建一個對象時,它會打印50,然後打印0.這很奇怪,因爲我在那裏做的是我想要的一種改變這個值的基本方法。 我做錯了什麼?

有一段時間我認爲這是由於該代碼

def __setattr__(self, key, value): 
    if key == "position" or key == "width" or key == "height": 
     if key == "position": 
      self.__position = value 
     if key == "width": 
      self.__width = value 
     if key == "height": 
      self.__height = value 
     self.__get_shape() 

但我評論它,並沒有什麼改變。 然後我想這是因爲變量不能用下劃線命名,但這也不是真的。 我完全沒有想法,真的。

編輯: 現在我找到了原因。就像我想的那樣,setattr - 父類也使用其中之一。有什麼辦法可以讓settattr只適用於其他類,或只適用於其他鍵?我希望它能夠以我的方式設置位置,高度和寬度。

+0

請注意,兩個主要的下劃線調用*「name mangling」*,這會使一切變得更加複雜。對於按約定的私有屬性,單個前導下劃線就足夠了。 – jonrsharpe

回答

2

自定義__setattr__可能會很棘手,容易出錯,並且根本不適合這裏的工作。

要定製設置器,使用python屬性而不是使用__setattr__來更好地設計決策。這裏是一個簡化的例子:

class Window(object): 
    def __init__(self, width=640): 
     self._width = width 

    @property 
    def width(self): 
     """I'm the 'width' property.""" 
     return self._width 

    @width.setter 
    def width(self, value): 
     # your custom setter logic here... 
     self._width = value 

開始閱讀here

+0

非常感謝!這是真正的幫助,並且我認爲,這只是解決了我的問題完全地 –

+0

對不起,我用這個代碼,這樣 '@財產 高清文本(個體經營): 迴歸自我.__文本 @ text.setter 高清文本(個體經營,文字): 打印 「富」 自我.__文本=文本 自.__ get_shape()' 然後我用 'obj.text = 「ABC」' 但沒有FOO輸出,__get_shape也」不是個叫。怎麼了? –