Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Объектно-ориентированное программирование. Определение класса и создание экземпляра класса в Python

Объектно-ориентированное программирование в python

Объектно-ориентированное программирование (ООП) - это способ организации программы позволяющий использовать один и тот же код многократно. В отличие от функции и модулей ООП позволяет не только разделить программу на фрагменты, но и описать предметы реального мира в виде объектов, а также организовать связи между этими объектами.

Основным "кирпичиком" ООП является класс. Классы в Python - это объект, включающий набор переменных и функций для управления этими переменными. Переменные называют атрибутами, а функции - методами. Класс является фабрикой объектов, т.е. позволяет создать неограниченное количество объектов, основанных на этом классе.

Определение класса и создание экземпляра класса в Python

Класс описывается с помощью ключевого слова class по следующей схеме:

class <Название класса>[(<Класс1>[, ..., <КлассN>])]:
    [""" Строка документирования """]
    <Описание атрибута и методов>

Инструкция создает новый объект и присваивает ссылку на него идентификатору, указанному после ключевого слова class. Это означает, что название класса должно полностью соответствовать правилам именований переменных. После названия класса в круглых скобках можно указать один или несколько базовых классов через запятую. Если класс не наследует базовые классы, то круглые скобки можно не указывать. Следует заметить, что все выражения внутри инструкции class выполняются при создании объекта, а не при создании экземпляра класса. В качестве примера создадим класс, внутри которого просто выводится сообщение:

# -*- coding: cp866 -*-
class Exemple:
    """ Это строка документирования """
    print "Инструкции выполняются сразу"
 
raw_input()

Этот пример содержит только определение класса Exemple и не создает экземпляр класса. Как только поток выполнения достигнет инструкции class, сообщение, указанное в операторе print, будет сразу выведено. Создание переменной (атрибута) внутри класса аналогично созданию обычной переменной. Метод внутри класса создается так же, как и обычная функция, с помощью инструкции def. Метод класса в первом параметре автоматически передается ссылка на экземпляр класса. Общепринято этот параметр называть именем self, хотя это и не обязательно. Доступ к атрибутам и методам класса производится через переменную self с помощью точечной нотации. Например к атрибуту var1 из метода класса можно можно обратиться так: self.var1

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

<Экземпляр класса> = <Название класса>([Параметры])

Определим класс Exemple с атрибутам var1 и методом f_print(), выводящим значение этого атрибута, а затем создадим экземпляр класса и вызовем метод:

Создание атрибута и метода

class Exemple:
    var1 = 10             # Переменная внутри класса
    def f_print(self):    # self - это ссылка на экземпляр класса
        print self.var1   # Выводим значение переменной
 
c1 = Exemple()            # Создание экземпляра класса
                          # Вызываем метод f_print()
c1.f_print()              # self не указывается при вызове метода
print c1.var1             # К атрибуту можно обратиться непосредственно

При обращении к методам класса используется следующий формат:

<Экземпляр класса>.<имя метода>([Параметры])

Обратите внимание на то, что при вызове метода не нужно передавать ссылку на экземпляр класса в качестве параметра, как это делается в определении метода внутри класса. Ссылку на экземпляр интерпретатор передает автоматически. Обращение к атрибуту класса осуществляется аналогично:

<Экземпляр класса>.<Имя атрибута>

Для доступа к атрибутам и методам можно также использовать следующие функции:

getattr() - возвращает значение атрибута по его названию, заданному в виде строки. С помощью этой функции можно сформировать название атрибута динамически во время выполнения программы.

setattr() - задает значение атрибута. Название атрибута указывается в виде строки.

delattr() - удаляет указанный атрибут. Название атрибута указывается в виде строки.

hasattr() - проверяет наличие указанного атрибута. Если атрибут существует, функция возврощает значение True.

Как работаю функции: getattr(), setattr() и hasattr()

class Class1:
    var1 = 10
    def f_test(self):
        return self.var1
 
c1 = Class1()                    # Создаем экземпляр класса
print getattr(c1, "var1")        # Выведет: 10
print getattr(c1, "f_test")()    # Выведет: 10
print getattr(c1, "var2", 0)     # Выведет: 0, т.к. атрибут не найден
setattr(c1, "var2", 20)          # Создаем атрибут var2
print getattr(c1, "var2", 0)     # Выведет: 20
delattr(c1, "var2")              # Удаляем атрибут var2
print getattr(c1, "var2", 0)     # Выведет: 0, т.к. атрибут не найден
print hasattr(c1, "var1")        # Выведет: True
print hasattr(c1, "var2")        # Выведет: False

Все атрибуты класса в языке Python является открытыми (public), т.е. доступными для непосредственного изменения. Кроме того, атрибуты можно создавать динамически после создания класса. Можно создать как атрибут объекта класса, так и атрибут экземпляра класса.

Прицепы ООП применяются аналогична и в других языках программирования. Создание игр, программ, скриптов и сайтов все используют объектно-ориентированное программирование. Сайты сделанные по этим принципам значительно легче понимать и редактировать нужные его функции, можете заказать сайт сделанный профессиональными программистами которые пользуются только новейшими методиками разработки сайтов.

Комментариев: 5
  1. Питочик | 2013-08-03 в 18:11:19

    Вот про ООП очень интересует данная тема, надеюсь будут и дальше статьи. Интересует примеры статей с решением определенных задач нежели общее понимание ООП. Надеюсь я правильно выразился :) в любом случае продолжайте, буду следить за данной рубрикой.

  2. В Python, ООП можно и не использовать. У Python отлично развита модульная архитектура в ООП нет такой уж и надобности. Но, кому как для меня удобнее использовать модули чем классы.

  3. >>Следует заметить, что все выражения внутри инструкции class выполняются при создании объекта, а не при создании экземпляра класса.

    Это взорвало мозг... со второго раза понял, что под словом "объект" имелось в виду класс, который относительно языка/реализация является объектом потока. Правильно я понял?

  4. >> Метод класса в первом параметре автоматически передается ссылка на экземпляр класса. Общепринято этот параметр называть именем self, хотя это и не обязательно.

    Что-то это вводит в заблуждение при мысли о передачи параметров методу объекта...

  5. Александр | 2014-02-23 в 00:30:58

    Очень интересная статья: http://studopedia.net/2_37721_pokoleniya-yazikov-programmirovaniya.html про поколение языков программирования...

Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

(обязательно)