无法为对象的属性赋值

时间:2015-09-26 07:14:51

标签: python oop object

我真的很奇怪。我写了一堂课,然后我想修改她一下。我改变了一些事情,现在:

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 仅适用于其他类,或仅适用于其他类?我希望它只是按照我的方式设置位置,高度和宽度。

1 个答案:

答案 0 :(得分:2)

自定义__setattr__可能很棘手,容易出错,而且根本不适合这里的工作。

要自定义setter,使用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