Найти - Пользователи
Полная версия: геттеры и сеттеры или @property
Начало » Python для новичков » геттеры и сеттеры или @property
1 2 3
psyh
Чувствую у меня глупый вопрос, но как обратиться то к сеттеру?! Час уже ищу инфу.
Читаю Доусона, написано про сеттеры, но как к нему обратиться непонятно. Полез искать в интернете, и там так же, про декораторы, про сеттеры написано, а вот про то как к нему обратиться ни слова, видимо это столь очевидно что никому в голову не приходит хотя бы вскользь упомянуть об этом. И только я один не в теме.
к примеру:
@property
def name(self):
    return self.__name
@name.setter
def name (self, new_name):
    self.__name = new_name

А как собственно вызвать то сеттер? Внутри @property и @name.setter метод с одним и тем же именем.
4kpt_III
К сеттеру обращение происходит автоматически, когда Вы в атрибут пытаетесь что-то записать…
psyh
Спасибо.
Но почему-то не работает:

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) #Должен обратиться к сеттеру?
FishHook
Почему вы используете свойство, как метод? Если вам нужен метод, зачем тогда городить свойство?

Вот так используют свойства
#!/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)
psyh
Спасибо большое. Теперь понятно.
А здесь не работало потому что я пытался закрытый аттрибут вывести?
print("Громкость изменена на ", self.__volume)
FishHook
psyh
А здесь не работало потому что я пытался закрытый аттрибут вывести?
Не работало, потому что вы не правильно обращались к свойству
psyh
Это само собой. Спасибо за помощь.
Budulianin
Tropick
На сколько я понимаю, property возвращает объект - копию входящего с реализацией getter setter deletter методами….поправьте если не так!

Всё очень просто. Property нужно использовать, когда твой атрибут должен быть динамическим.
Если его значение меняется в зависимости от чего-то и при следующем обращении к нему, там может находиться другое значение, то нужно используя property, описать вычисление значения этого атрибута.
psyh
Вроде понятно, да несовсем. Вот задачка из Доусона которую сделал двумя способами. Имитирует пульт ТВ. Каналы изменяются напрямую, а звук сделан с @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()
FishHook
В чем конкретно состоит вопрос?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB