Поиск по сайту:

Как создавать классы и определять объекты в Python 3


Введение

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

Одной из наиболее важных концепций объектно-ориентированного программирования является различие между классами и объектами, которое определяется следующим образом:

  • Класс — схема, созданная программистом для объекта. Это определяет набор атрибутов, которые будут характеризовать любой объект, созданный из этого класса.
  • Объект — экземпляр класса. Это реализованная версия класса, где класс проявляется в программе.

Они используются для создания шаблонов (в случае классов) и последующего использования шаблонов (в случае объектов).

В этом руководстве мы рассмотрим создание классов, создание экземпляров объектов, инициализацию атрибутов с помощью метода конструктора и работу с более чем одним объектом одного класса.

Предпосылки

У вас должен быть установлен Python 3 и настроена среда программирования на вашем компьютере или сервере. Если у вас не настроена среда программирования, вы можете обратиться к руководствам по установке и настройке среды программирования на вашем сервере, подходящей для вашей операционной системы (Ubuntu, CentOS, Debian и т. д.).

Классы

Классы подобны чертежам или прототипам, которые вы можете определить для использования при создании объектов.

Мы определяем классы, используя ключевое слово class, аналогично тому, как мы определяем функции, используя ключевое слово def.

Информация: Чтобы следовать примеру кода в этом руководстве, откройте интерактивную оболочку Python в вашей локальной системе, выполнив команду python3. Затем вы можете копировать, вставлять или редактировать примеры, добавляя их после приглашения >>>.

Давайте определим класс с именем Shark, с которым связаны две функции: одна для плавания и одна для того, чтобы быть крутым:

class Shark:
    def swim(self):
        print("The shark is swimming.")

    def be_awesome(self):
        print("The shark is being awesome.")

Поскольку эти функции имеют отступ под классом Shark, они называются методами. Методы — это особый вид функций, которые определены внутри класса.

Аргументом этих функций является слово self, которое является ссылкой на объекты, созданные на основе этого класса. Для ссылки на экземпляры (или объекты) класса self всегда будет первым параметром, но он не обязательно должен быть единственным.

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

Создание класса Shark выше предоставило нам схему объекта.

Объекты

Объект является экземпляром класса. Мы можем взять класс Shark, определенный выше, и использовать его для создания объекта или его экземпляра.

Мы создадим объект Shark с именем sammy:

sammy = Shark()

Здесь мы инициализировали объект sammy как экземпляр класса, установив его равным Shark().

Теперь давайте воспользуемся двумя методами с объектом Shark sammy:

sammy = Shark()
sammy.swim()
sammy.be_awesome()

Объект Shark sammy использует два метода swim() и be_awesome(). Мы вызывали их с помощью оператора точки (.), который используется для ссылки на атрибут объекта. В этом случае атрибут — это метод, и он вызывается с помощью круглых скобок, как если бы вы вызывали его с помощью функции.

Поскольку ключевое слово self было параметром методов, определенных в классе Shark, объект sammy передается методам. Параметр self гарантирует, что у методов есть способ ссылаться на атрибуты объекта.

Однако, когда мы вызываем методы, внутри круглых скобок ничего не передается, объект sammy автоматически передается с помощью оператора точки.

Давайте добавим объект в контексте программы:

class Shark:
    def swim(self):
        print("The shark is swimming.")

    def be_awesome(self):
        print("The shark is being awesome.")


def main():
    sammy = Shark()
    sammy.swim()
    sammy.be_awesome()

if __name__ == "__main__":
    main()

Давайте запустим программу, чтобы посмотреть, что она делает:

  1. python shark.py
Output
The shark is swimming. The shark is being awesome.

Объект sammy вызывает два метода в функции main() программы, вызывая выполнение этих методов.

Метод конструктора

Метод конструктора используется для инициализации данных. Он запускается, как только создается экземпляр объекта класса. Также известный как метод __init__, он будет первым определением класса и выглядит следующим образом:

class Shark:
    def __init__(self):
        print("This is the constructor method.")

Если вы добавите указанный выше метод __init__ в класс Shark в приведенной выше программе, программа выведет следующее без каких-либо изменений в sammy создание экземпляра:

Output
This is the constructor method. The shark is swimming. The shark is being awesome.

Это связано с тем, что метод конструктора инициализируется автоматически. Вы должны использовать этот метод для выполнения любой инициализации, которую вы хотели бы сделать с вашими объектами класса.

Вместо использования описанного выше метода конструктора давайте создадим метод, использующий переменную name, которую мы можем использовать для присвоения имен объектам. Мы передадим name в качестве параметра и установим self.name равным name:

class Shark:
    def __init__(self, name):
        self.name = name

Затем мы можем изменить строки в наших функциях, чтобы они ссылались на имена, как показано ниже:

class Shark:
    def __init__(self, name):
        self.name = name

    def swim(self):
        # Reference the name
        print(self.name + " is swimming.")

    def be_awesome(self):
        # Reference the name
        print(self.name + " is being awesome.")

Наконец, мы можем установить имя объекта Shark sammy равным Sammy, передав его в качестве параметра Класс акулы:

class Shark:
    def __init__(self, name):
        self.name = name

    def swim(self):
        print(self.name + " is swimming.")

    def be_awesome(self):
        print(self.name + " is being awesome.")


def main():
    # Set name of Shark object
    sammy = Shark("Sammy")
    sammy.swim()
    sammy.be_awesome()

if __name__ == "__main__":
    main()

Теперь мы можем запустить программу:

  1. python shark.py
Output
Sammy is swimming. Sammy is being awesome.

Мы видим, что имя, которое мы передали объекту, распечатывается. Мы определили метод __init__ с именем параметра (вместе с ключевым словом self) и определили переменную внутри метода.

Поскольку метод конструктора инициализируется автоматически, нам не нужно явно вызывать его, а только передавать аргументы в круглых скобках после имени класса при создании нового экземпляра класса.

Если бы мы хотели добавить еще один параметр, например age, мы могли бы сделать это, также передав его методу __init__:

class Shark:
    def __init__(self, name, age):
        self.name = name
        self.age = age

Затем, когда мы создаем наш объект sammy, мы можем передать возраст Сэмми в нашем операторе:

sammy = Shark("Sammy", 5)

Чтобы использовать age, нам также потребуется создать в классе метод, который его вызывает.

Методы конструктора позволяют нам инициализировать определенные атрибуты объекта.

Работа с несколькими объектами

Классы полезны, потому что они позволяют нам создавать много похожих объектов на основе одного и того же чертежа.

Чтобы понять, как это работает, давайте добавим в нашу программу еще один объект Shark:

class Shark:
    def __init__(self, name):
        self.name = name

    def swim(self):
        print(self.name + " is swimming.")

    def be_awesome(self):
        print(self.name + " is being awesome.")

def main():
    sammy = Shark("Sammy")
    sammy.be_awesome()
    stevie = Shark("Stevie")
    stevie.swim()

if __name__ == "__main__":
  main()

Мы создали второй объект Shark с именем stevie и передали ему имя Stevie. В этом примере мы использовали метод be_awesome() с sammy и метод swim() с stevie.

Запустим программу:

  1. python shark.py
Output
Sammy is being awesome. Stevie is swimming.

Вывод показывает, что мы используем два разных объекта, объект sammy и объект stevie, оба из класса Shark.

Классы позволяют создавать более одного объекта по одному и тому же шаблону, не создавая каждый объект с нуля.

Заключение

В этом учебнике мы рассмотрели создание классов, создание экземпляров объектов, инициализацию атрибутов с помощью метода конструктора и работу с несколькими объектами одного класса.

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