Автор — Грэг Валтерс (Greg Walters)

В прошлый раз я обещал, что мы поговорим о классах. Итак, приступим. Что такое классы и что в них такого хорошего?

Класс — это способ построения объектов. Объект — это способ группирования атрибутов и поведений. Я знаю, это звучит запутанно, но я вам объясню. Представьте это себе таким образом. Объект — это способ смоделировать что-либо в реальном мире. Класс — это метод, используемый нами для осуществления этого. Например, у нас дома есть три собаки: бигль, лабрадор и помесь немецкой овчарки с австралийским хилером. Все три — собаки, но все разные. У них есть общие черты, но есть и отличия. К примеру, бигль — низкий, пухлый, коричневый и сварливый. Лабрадор — среднего размера, чёрный и очень спокойный. Помесь овчарки и хилера — высокая, худая, чёрная и, более того, немного сумасшедшая. Сразу хорошо заметны некоторые атрибуты. Низкий, средних размеров, высокий — атрибуты роста. Сварливый, спокойный и сумасшедший — атрибуты характера. С точки зрения поведения можно рассмотреть приём пищи, сон, игры и другие действия.

Все три — представители класса «Собака» (Dog). Вернёмся к приведённым выше атрибутам, используемым для описания каждой собаки. У нас получатся такие: Dog.Name (кличка), Dog.Height (рост), Dog.Build (телосложение) и Dog.Color (окрас). Также у нас есть варианты поведения, такие как: Dog.Bark (лай), Dog.Eat (приём пищи), Dog.Sleep (сон), и т. д.

Как я говорил ранее, собаки разных пород. Каждая порода будет подклассом класса Dog (собака). Схематически это будет выглядеть так.

           /--Бигль
Собака ---|-- Лабрадор
           \--Овчарка/Хилер

Каждый подкласс наследует все атрибуты класса Dog. Поэтому, если мы создадим экземпляр Beagle (бигль), он получит все атрибуты родительского класса Dog.

Beagle = Dog()
Beagle.Name = 'Арчи'
Beagle.Height = 'Низкий'
Beagle.Build = 'Пухлый'
Beagle.Color = 'Коричневый'

Становится понятнее? Итак, давайте создадим наш простой класс Dog (показан выше). Нач-нём с ключевого слова «class» и названия нашего класса.

Перед тем, как углубиться в код, обратите внимание на функцию, которую мы здесь определили. Функция _init_ (два подчёркивания + init + два подчёркивания) — это инициализация, которая работает в любом классе. Она выполняется, как только мы вызываем в коде наш класс. В данном случае мы создали целый ряд параметров, устанавливающих основные сведения о нашем классе: кличка, окрас, рост, телосложение, настроение, возраст и состояния «голоен» и «утомлён» (переменные «Hungry» и «Tired» соответственно). Мы ещё вернёмся к ним. Теперь давайте добавим больше кода.

Beagle = Dog('Арчи','Коричневый','Низкий','Пухлый','Сварливый',12)
print Beagle.name
print Beagle.color
print Beagle.mood
print Beagle.Hungry

Этот код БЕЗ отступов и находится он вне нашего класса, используя его. Первая строка создаёт экземпляр (Beagle) нашего класса Dog.* Это — инстанцирование, процесс создания экземпляра класса. Вслед за этим мы также пере-дали определённую информацию экземпляру нашего класса (кличка бигля, его окрас и тому подобное). Следующие четыре строки получают информацию об объекте Beagle. Вставьте в класс Dog (после функции _init_) код, расположенный в правом верхнем блоке.

Теперь мы можем использовать Beagle.Eat() или Beagle. Sleep(). Давайте добавим ещё один метод. Мы назовём его Bark. Его код показан справа.

Сделаем его более гибким: в зависимости от настроения собаки лай будет меняться. На следующей странице показан полный код класса на данный момент.

Итак, если запустить скрипт, то получим:

Моя кличка Арчи
Мой окрас Коричневый
Моё настроение Сварливый
Я голоден = False
Нюх-нюх… Не голоден
Ммм Ммм… Ням Ням
Рррррррр… Гав! Гав!

Что ж, мы позаботились о старом сварливом бигле. Однако, как я уже говорил, у меня три собаки. Так как класс мы написали продуманно, нам теперь осталось лишь создать ещё два экземпляра нашего класса.

Lab = Dog('Нина','Чёрный','Средний','Крепкий','Спокойный',7)
Heeler = Dog('Медведь','Чёрный','Высокий','Худой','Сумасшедший',9)
print 'Моя кличка %s' % Lab.name
print 'Мой окрас %s' % Lab.color
print 'Моё настроение %s' % Lab.mood
print 'Я голоден = %s' % Lab.Hungry
Lab.Bark()
Heeler.Bark()

Заметьте, я создал экземпляры для обеих собак ещё до инструкций вывода на экран. Это не проблема, так как я «определил» экземпляр, прежде чем вызывать какой-либо метод. Вот полный вывод нашей программы.

Моя кличка Арчи
Мой окрас Коричневый
Моё настроение Сварливый
Я голоден = False
Нюх-нюх… Не голоден
Ммм Ммм… Ням Ням
Рррррррр… Гав! Гав!
Моя кличка Нина
Мой окрас Чёрный
Моё настроение Спокойный
Я голоден = False
Зевает…ok…Гав
Ав Ав Ав Ав Ав Ав Ав Ав Ав Ав Ав Ав

Вы научились основам. В качестве домашнего задания расширьте класс Dog, чтобы он допускал большее количество методов, к примеру таких, как Play (играть), или Encounter StrangeDog (Повстречать НезнакомуюСобаку), или вроде того. В следующий раз мы начнём обсуждать программирование GUI или Графического Интерфейса Пользователя. Для этого мы воспользуемся Boa Constructor.

Коды

class Dog():
	def __init__(self,dogname,dogcolor,dogheight,dogbuild,dogmood,dogage):
	#здесь мы установим атрибуты для нашего класса «Собака»
		self.name = dogname
		self.color = dogcolor
		self.height = dogheight
		self.build = dogbuild
		self.mood = dogmood
		self.age = dogage
		self.Hungry = False
		self.Tired = False

	def Eat(self):
		if self.Hungry:
			print 'Ммм Ммм...Ням Ням'
			self.Hungry = False
		else:
			print 'Нюх-нюх...Не голоден'	
	def Sleep(self):
		if self.Tired:
			print 'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
			self.Tired = False

	def Bark(self):
		if self.mood == 'Сварливый':
			print 'Рррррррр... Гав! Гав!'
		elif self.mood == 'Спокойный':
			print 'Зевает...ok...Гав'
		elif self.mood == 'Сумасшедший':
			print 'Ав Ав Ав Ав Ав Ав Ав Ав Ав Ав Ав Ав'
		else:
			print 'Гав! Гав!'

Beagle = Dog('Арчи','Коричневый','Низкий','Пухлый','Сварливый',12)
print 'Моя кличка %s' % Beagle.name
print 'Мой окрас %s' % Beagle.color
print 'Моё настроение %s' % Beagle.mood
print 'Я голоден = %s' % Beagle.Hungry
Beagle.Eat()
Beagle.Hungry = True
Beagle.Eat()
Beagle.Bark()