Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 24, 2013 11:34:13

ankane
Зарегистрирован: 2012-11-16
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Поясните пример из книги Лутца

class Employee:
	def __init__(self,name,salary=0):
		self.name = name
		self.salary = salary
	def giveRaise(self,percent):
		self.salary=self.salary + (self.salary*percent)
	def work(self):
		print (self.name, "does stuff")
	def __repr__(self):
		return "<Employee: name=%s, salary=%s>"%(self.name, self.salary)
class Chef(Employee):
	def __init__(self,name):
		Employee.__init__(self.name,50000)
	def work(self):
		print(self.name,'makes food')


Я не понимаю принципа использовать перегрузку __init__ новых экземплярах класса типа Chef. Что нам дает вот этот кусок
def __init__(self,name):
		Employee.__init__(self.name,50000)
	def work(self):

Объясните плз логику. Я понимаю что :
1.объявляем конструктор класса что даст текущему экземпляру и всем его наследникам Name
2.идем в родительский класс,и берем от туда функция объявления Name и указывавем зп в 50000
3 ????
Так что-ли? То-ли я пока писал все понял, то-ли еще больше запутался в этих обертках) Это типа мы берем __init__ у родителя чтобы что? Чтобы не писать еще раз объявление переменных в классе?

Офлайн

#2 Янв. 24, 2013 11:39:09

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Поясните пример из книги Лутца

Все экземпляры Шефа будут иметь salary = 50000. То есть в данном случае мы хотим показать, что есть некое значение по умолчанию для этого класса.



Офлайн

#3 Янв. 24, 2013 11:40:23

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

Поясните пример из книги Лутца

Если в классе наследнике в методе не вызвать явно метод родителя, то все что в методе родителя происходило не произойдет в наследнике.

То есть в данном примере, если напишешь так

class Chef(Employee):
	def __init__(self,name):
		self.foo=5
	def work(self):
		print(self.name,'makes food')
То возникнет ошибка, ибо никакого self.name у Chef нет, он появляется в ините родителя, поэтому нужно этот инит явно вызвать.



Офлайн

#4 Янв. 24, 2013 12:13:58

ankane
Зарегистрирован: 2012-11-16
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Поясните пример из книги Лутца

То возникнет ошибка, ибо никакого self.name у Chef нет, он появляется в ините родителя, поэтому нужно этот инит явно вызвать.

Т.е. мы в родителе указали атрибуты по умолчанию. Но мы хотим чтобы к наследнике, уже существующие в родителе атрибуты, были по умолчанию модифицированы. И что-бы а) не наследовать дефолтные атрибуты родителя и б) не писать заново под каждый экземпляр свой инит, мы просто модифицируем в своем ините, инит родителя ?

Офлайн

#5 Янв. 24, 2013 13:13:22

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

Поясните пример из книги Лутца

В этом и состоит смысл наследования



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version