2015-09-26 145 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也”不是个叫。怎么了? –