Форум сайта python.su
0
Чувствую у меня глупый вопрос, но как обратиться то к сеттеру?! Час уже ищу инфу.
Читаю Доусона, написано про сеттеры, но как к нему обратиться непонятно. Полез искать в интернете, и там так же, про декораторы, про сеттеры написано, а вот про то как к нему обратиться ни слова, видимо это столь очевидно что никому в голову не приходит хотя бы вскользь упомянуть об этом. И только я один не в теме.
к примеру:
@property def name(self): return self.__name @name.setter def name (self, new_name): self.__name = new_name
Офлайн
39
К сеттеру обращение происходит автоматически, когда Вы в атрибут пытаетесь что-то записать…
Офлайн
0
Спасибо.
Но почему-то не работает:
class Tv(object): """Имитируем телевизор""" def __init__(self, volume = 5): self.__volume = volume @property def volume(self): # return self.__volume print(self.__volume) @volume.setter def volume(self, new_volume): self.__volume = new_volume print("Громкость изменена на ", self.__volume) my_tv = Tv() my_tv.volume() #должен обратиться к свойству? my_tv.volume(8) #Должен обратиться к сеттеру?
Офлайн
568
Почему вы используете свойство, как метод? Если вам нужен метод, зачем тогда городить свойство?
Вот так используют свойства
#!/usr/bin/env python # -* coding: utf-8 -*- class Tv(object): """Имитируем телевизор""" def __init__(self, volume = 5): self.__volume = volume @property def volume(self): return self.__volume @volume.setter def volume(self, new_volume): print("Громкость изменена на %s" % new_volume) self.__volume = new_volume my_tv = Tv() print(my_tv.volume) my_tv.volume = 10 print(my_tv.volume)
Отредактировано FishHook (Июль 7, 2015 19:53:46)
Офлайн
0
Спасибо большое. Теперь понятно.
А здесь не работало потому что я пытался закрытый аттрибут вывести?
print("Громкость изменена на ", self.__volume)
Офлайн
568
psyhНе работало, потому что вы не правильно обращались к свойству
А здесь не работало потому что я пытался закрытый аттрибут вывести?
Офлайн
0
Это само собой. Спасибо за помощь.
Офлайн
33
Tropick
На сколько я понимаю, property возвращает объект - копию входящего с реализацией getter setter deletter методами….поправьте если не так!
Офлайн
0
Вроде понятно, да несовсем. Вот задачка из Доусона которую сделал двумя способами. Имитирует пульт ТВ. Каналы изменяются напрямую, а звук сделан с @property. Оба способа работают, но без @property получается 3 строчки, а с @property 7 строк.
#!/usr/bin/env python3.4 #Телевизор class Tv(object): """Имитируем телевизор""" def __init__(self, channel = 1, volume = 5): self.__channel = channel self.__volume = volume def set_channel(self): self.__channel = input("Выберите канал\n") print("канал изменен на ", self.__channel) @property def volume(self): return self.__volume @volume.setter def volume(self, new_volume): self.__volume = new_volume print("Громкость изменена на ", self.__volume) def talk(self): print("Текущий канал\t", self.__channel) print("Текущая громкость\t", self.__volume) def main(): my_tv = Tv() choice = None print("Вы включили телевизор.\n") my_tv.talk() while choice != "0": print(""" МОЙ ТЕЛЕВИЗОР 0 - Выключить телевизор 1 - Переключить канал 2 - Изменить громкость 3 - Узнать текущие параметры """) choice = input("Сделайте ваш выбор:\t") if choice == "0": print("До новых встреч") elif choice == "1": my_tv.set_channel() elif choice == "2": my_tv.volume = input("Выберите громкость\t") elif choice == "3": my_tv.talk() else: print("Вы промахнулись мимо пульта") main()
Офлайн
568
В чем конкретно состоит вопрос?
Офлайн