Это старая версия документа.


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

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

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

Они трое относяться к классу «Dog». Возвращаясь назад к свойствам, которые мы использовали для описания каждого, мы имеем Dog.Name (имя), Dog.Height (длина), Dog.Build (сложение тела - тощая, пухлая, и др.), and Dog.Color (цвет). Мы также имеем действия Dog.Bark (лаять), Dog.Eat (кушать), Dog.Sleep (спать).

Как я до этого сказал, каждая собака имеет собственную породу. Каждая порода будет подклассом в классе «Dog». На диаграмме это выглядит вот так:

        /-- Beagle (короткая Гончая)
Dog ---|--Lab (Лабрадор)
        \-- Shepherd/Heeler (немецкая Овчарка)

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

Beagle = Dog()
Beagle.Name = 'Archie'
Beagle.Height = 'Short'
Beagle.Build = 'Chubby'
Beagle.Color = 'Brown'

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

class Dog():
    def __init__(self,dogname,dogcolor,dogheight,dogbuild,dogmood,dogage):
    #here we setup the attributes of our dog
        self.name = dogname 
        self.color = dogcolor 
        self.height = dogheight 
        self.build = dogbuild 
        self.mood = dogmood 
        self.age = dogage 
        self.Hungry = False 
        self.Tired = False

Перед тем, как мы будем разбираться дальше в нашем коде, обратите внимание на функцию, которую мы объявили. Функция init (два знака подчёркивания + 'init' + два знака подчёркивания) - это функция инициализации, которая работает с любым классом. Как скоро мы вызовим наш класс в коде, настолько быстро он будет запущен. В этом случае, мы должны установить число параметров, чтобы записать некоторую основную информацию о нашем классе: name (имя), color (цвет), height (длина), build (сложение тела), mood (настроение), age (возраст), и пару переменных - Hungry (голодный) и Tired (усталый). Мы еще вернёмся к этому немного позже. Давайте добавим еще немного кода.

Beagle = Dog('Archie','Brown','Short','Chubby','Grumpy',12)
print Beagle.name
print Beagle.color
print Beagle.mood
print Beagle.Hungry

Этот код БЕЗ ОТСТУПОВ, который «проживает» вне класса, код, который использует наш класс. В первой строке создаёт образец нашего класса «Dog», названного как Beagle. Это называется созданием. Когда мы сделаем это, мы также получим прошедшую определённую информацию образца класса, например, имя Beagle, цвет, и другое. Следующие четыре строки просто запрашивают объект Beagle и получает обратно информацию в возвращении. Настало время более сложного кода! Добавьте код, показанный ниже в класс после функции init.

def Eat(self):
    if self.Hungry:
        print 'Yum Yum...Num Num'
        self.Hungry = False
    else:
        print 'Sniff Sniff...Not Hungry'
def Sleep(self):
    print 'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'
    self.Tired = False

def Bark(self):
    if self.mood == 'Grumpy':
        print 'GRRRRR...Woof Woof'
    elif self.mood == 'Laid Back':
        print 'Yawn...ok...Woof'
    elif self.mood == 'Crazy':
        print 'Bark Bark Bark Bark Bark Bark Bark'
    else:
        print 'Woof Woof'

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

Его я сделал более гибким. В зависимости от настроения собаки, вид лая будет меняться.

class Dog():
    def __init__(self,dogname,dogcolor,dogheight,dogbuild,dogmood,dogage):
        #here we setup the attributes of our dog
        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 'Yum Yum...Num Num' 
            self.Hungry = False
        else:
            print  'Sniff  Sniff...Not  Hungry'

    def Sleep(self):
        print 'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ' 
        self.Tired = False

    def Bark(self):
        if self.mood == 'Grumpy':
            print 'GRRRRR...Woof Woof'
        elif self.mood == 'Laid Back': 
            print 'Yawn...ok...Woof'
        elif  self.mood  ==  'Crazy':
            print 'Bark Bark Bark Bark Bark Bark Bark' 
        else:
            print 'Woof  Woof'

Beagle = Dog('Archie','Brown','Short','Chubby','Grumpy',12) 
print 'My name is %s' % Beagle.name
print 'My color is %s' % Beagle.color 
print 'My mood is %s' % Beagle.mood 
print 'I am hungry = %s' % Beagle.Hungry 
Beagle.Eat()
Beagle.Hungry = True 
Beagle.Eat() 
Beagle.Bark()

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

My name is Archie
My color is Brown
My mood is Grumpy
I am hungry = False
Sniff Sniff...Not Hungry
Yum Yum...Num Num
GRRRRR...Woof Woof

Теперь, это позаботится о сердитой старой Гончей. В любом случае, как я сказал ранее, у меня имеется 3 собаки. Давайте добавим более двух образцов нашего класса «Dog».

Lab = Dog('Nina','Black','Medium',' Heavy','Laid Back',7)
Heeler = Dog('Bear','Black','Tall','Skinny','Crazy',9)
print 'My Name is %s' % Lab.name
print 'My color is %s' % Lab.color
print 'My Mood is %s' % Lab.mood
print 'I am hungry = %s' % Lab.Hungry
Lab.Bark()
Heeler.Bark()

Заметьте, я создал образцы обеих собак перед тем, как я выдал высказывания. Это не проблема с тех пор, как я “определил” образец собак, вызвав при этом любой из методов. Вот результат полной программы класса «Dog»:

My name is Archie
My color is Brown
My mood is Grumpy
I am hungry = False
Sniff Sniff...Not Hungry
Yum Yum...Num Num
GRRRRR...Woof Woof
My Name is Nina
My color is Black
My Mood is Laid Back
I am hungry = False
Yawn...ok...Woof
Bark Bark Bark Bark Bark Bark Bark

Теперь Вы поняли основу, Ваше домашнее задание будет расширить наш класс «Dog» и добавить еще несколько методов, например, играть (Play) или ВстречаПрохожейСобаки или что-нибудь вроде этого.

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