2015-09-26 6 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

Обратите внимание, что два ведущих символа подчеркивания вызывают * «имя mangling» *, что делает все более сложным. Для атрибута private-by-convention достаточно одного подчеркивания. – 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

Простите, я использовал этот код, как этот '@property четкости текста (сам): Самовозврат .__ текст @ text.setter четкости текста (Я, текст): печать "Foo" само .__ текст = текст само .__ get_shape() ' Затем я использую ' obj.text = "ABC" ' Но нет никакого вывода Foo, __get_shape также ISN» t называется. Что не так? –

Смежные вопросы