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 :(得分: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。