Форум сайта python.su
При присваивании атрибуту (свойству) объекта какого-нибудь значения, например, вот так
sd.q = 52
#coding:utf-8 class SD: def __init__(self): self._q = 0 @property def q(self): print("getter") return self._q @q.setter def q(self, val): print("setter (%d)" % (val)) self._q = val if __name__ == "__main__": sd = SD() print(sd.q) sd.q = 52 print(sd.q)
pi@pi:~python3 test.py getter 0 setter (52) getter 52
pi@pi:~python test.py getter 0 52
Офлайн
В третьем питоне все объекты нового типа, во втором - только унаследованные от object, рекомендую ВСЕГДА наследоваться от object, чтобы не ломать потом себе голову такими якобы “багами”
class SD(object):
Офлайн
Или
# class SD: def __init__(self): self._q = 0 @property def q(self): print("getter") return self._q @q.setter def new_q(self, val): print("setter (%d)" % (val)) self._q = val
Офлайн
FishHookFishHook, спасибо за совет! Ура! Теперь работает. Но почему "якобы баг". Баг он и есть баг. Еще раз спасибо!
рекомендую ВСЕГДА наследоваться от object, чтобы не ломать потом себе голову такими якобы “багами”
Офлайн
Потому, что в классах старого и нового стиля по-разному формируются пространства имен
Ну и вот пример из официальной документации
# class C(object): def __init__(self): self._x = None @property def x(self): """I'm the 'x' property.""" return self._x @x.setter def x(self, value): self._x = value @x.deleter def x(self): del self._x
Отредактировано 4kpt_IV (Янв. 14, 2017 10:54:14)
Офлайн
4kpt_IVДа какие претензии!?
Претензии к языку если Вы не желаете читать документацию предъявлять все же не стоит
Офлайн
В 2.Х существуют классы старого и нового стиля. Старого - без object, а нового с object. У них разное поведение вплоть до механизма наследования. В 3.Х от старого стиля отказались и, так как там классы все одного стиля, явное указание object потеряло необходимость, так как это стало поведением по-умолчанию.
Отредактировано 4kpt_IV (Янв. 14, 2017 13:33:52)
Офлайн
А… Я таких тонкостей не знал. Вот теперь все встало на место. Спасибо за пояснения!
Офлайн
OldBeanВаши претензии необоснованы
Скорее это (если в официальной документации про Object написано явно) претензия к классикам жанра (фрагмент из книги Лутца “Изучаем Python” 4-е изд").
Отредактировано Stright (Янв. 14, 2017 15:40:58)
Офлайн
Да. Вы правы.
Вот и чудесно - теперь и Лутц реабилитирован! Можно спать спокойно.
Конечно, нужно внимательней и, главное, подряд (!) читать тексты книжек. К сожалению, это не всегда удается. Особенно когда пользуешься языком изредка. Обычно берешь пример из знакомой книжки, модифицируешь под свою задачу. А тут неожиданно взял да наступил на такие упругие грабли! У меня за этим сеттером стоит длинный обмен с микроконтроллером, а само свойство (точнее его значение) вообще не хранится на том компьютере, где работает питон. Там был довольно большой кусок уже работающего кода. Но захотелось все красиво оформить. Через классы и свойства. Поэтому пока локализовал баг - все проклял. Но очень рад, что проблема оказалась пустяковой!
Ну вот, вроде бы все вопросы “разрешены”. Тему можно закрывать. Еще раз спасибо всем за помощь!
Офлайн