Автор — Грэг Валтерс (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()