Уведомления

Группа в Telegram: @pythonsu

#1 Июль 7, 2015 19:07:16

psyh
От: Красноярск
Зарегистрирован: 2015-07-07
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

Чувствую у меня глупый вопрос, но как обратиться то к сеттеру?! Час уже ищу инфу.
Читаю Доусона, написано про сеттеры, но как к нему обратиться непонятно. Полез искать в интернете, и там так же, про декораторы, про сеттеры написано, а вот про то как к нему обратиться ни слова, видимо это столь очевидно что никому в голову не приходит хотя бы вскользь упомянуть об этом. И только я один не в теме.
к примеру:

@property
def name(self):
    return self.__name
@name.setter
def name (self, new_name):
    self.__name = new_name

А как собственно вызвать то сеттер? Внутри @property и @name.setter метод с одним и тем же именем.

Офлайн

#2 Июль 7, 2015 19:08:56

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

К сеттеру обращение происходит автоматически, когда Вы в атрибут пытаетесь что-то записать…

Офлайн

#3 Июль 7, 2015 19:42:25

psyh
От: Красноярск
Зарегистрирован: 2015-07-07
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

Спасибо.
Но почему-то не работает:

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) #Должен обратиться к сеттеру?

Офлайн

#4 Июль 7, 2015 19:53:08

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

Почему вы используете свойство, как метод? Если вам нужен метод, зачем тогда городить свойство?

Вот так используют свойства

#!/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)

Офлайн

#5 Июль 7, 2015 20:02:28

psyh
От: Красноярск
Зарегистрирован: 2015-07-07
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

Спасибо большое. Теперь понятно.
А здесь не работало потому что я пытался закрытый аттрибут вывести?

print("Громкость изменена на ", self.__volume)

Офлайн

#6 Июль 7, 2015 20:05:26

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

psyh
А здесь не работало потому что я пытался закрытый аттрибут вывести?
Не работало, потому что вы не правильно обращались к свойству



Офлайн

#7 Июль 7, 2015 20:13:12

psyh
От: Красноярск
Зарегистрирован: 2015-07-07
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

Это само собой. Спасибо за помощь.

Офлайн

#8 Июль 8, 2015 20:28:44

Budulianin
От:
Зарегистрирован: 2011-10-18
Сообщения: 1218
Репутация: +  33  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

Tropick
На сколько я понимаю, property возвращает объект - копию входящего с реализацией getter setter deletter методами….поправьте если не так!

Всё очень просто. Property нужно использовать, когда твой атрибут должен быть динамическим.
Если его значение меняется в зависимости от чего-то и при следующем обращении к нему, там может находиться другое значение, то нужно используя property, описать вычисление значения этого атрибута.



Офлайн

#9 Июль 14, 2015 08:47:49

psyh
От: Красноярск
Зарегистрирован: 2015-07-07
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

Вроде понятно, да несовсем. Вот задачка из Доусона которую сделал двумя способами. Имитирует пульт ТВ. Каналы изменяются напрямую, а звук сделан с @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()

Офлайн

#10 Июль 14, 2015 09:31:58

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

геттеры и сеттеры или @property

В чем конкретно состоит вопрос?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version