Понять основы классов на примерах

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

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

Оглавление:

  1. Введение в занятия
  2. Создать курс
  3. Метод конструктора
  4. Магический метод
  5. Метод экземпляра

1. Введение в занятия

Когда вы начали изучать Python, вы наверняка встретили предложение:

Python - объектно-ориентированный язык программирования

Это означает, что программирование на Python приводит к тому, что вас повсюду окружают объекты. В мгновение ока

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

Давайте посмотрим на несколько классических примеров объектов и классов:

a = 28
print(type(a))
#<class 'int'>

Мы определили объект a, который принадлежит к классу Integer.

l = [1,2,3]
print(type(l))
#<class 'list'>

На этот раз новый объект принадлежит классу List. Из объекта мы можем вызывать методы, уже встроенные в Python. Чтобы увидеть все методы, разрешенные в объекте, мы используем функцию dir:

dir(l)

Из выходных данных мы можем заметить, что класс может предоставлять три типа методов:

  • Метод инициализатора __init__, вызываемый таким образом, потому что это метод, который инициализирует атрибуты объекта. Более того, он автоматически вызывается после создания объекта.
  • Магические методы - это особые методы с двойным подчеркиванием с обеих сторон. Например, __add__ и __mul__ используются для суммирования и умножения объектов одного и того же класса соответственно, а __repr__ возвращает представление объекта в виде строки.
  • Методы экземпляра - это методы, принадлежащие созданному объекту. Например, l.append(4) добавляет элемент в конец списка.

2. Создайте класс

Теперь мы создадим пустой класс и будем постепенно добавлять части кода в учебник.

class Dog:
   pass

Мы создали класс с именем Dog, где pass используется, чтобы указать, что ничего не определено.

jack = Dog()
print(type(jack))
#<class '__main__.Dog'>

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

Объект также может называться экземпляром. Не запутайтесь, если вы найдете где-то написанные слова «экземпляр» или «объект», они всегда относятся к одному и тому же.

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

3. Метод инициализатора

Помимо кода, показанного ранее, для инициализации атрибутов класса Dog используется метод инициализатора __init__.

class Dog:
  def __init__(self,name,breed,age):
    self.Name = name
    self.Breed = breed
    self.Age = age
    print("Name: {}, Breed: {}, Age: {}".format(self.Name,
                                             self.Breed,self.Age))

Мы можем заметить, что у метода есть разные аргументы:

  • self - это стандартное обозначение, используемое в качестве первого аргумента, а относится к объекту, который будет создан позже. Также полезно получить доступ к атрибутам, принадлежащим классу.
  • name, breed и age - оставшиеся аргументы. Каждый аргумент используется для хранения значения конкретного атрибута объекта.
  • Name, Breed и Age - определенные атрибуты. Обратите внимание, что атрибуты обычно не пишутся с заглавной буквы. В этом посте они используются в верхнем регистре, чтобы подчеркнуть разницу между атрибутами и их соответствующими значениями.
jack = Dog('Jack','Husky',5)
#Name: Jack, Breed: Husky, Age: 5
print(jack)
#<__main__.Dog object at 0x000002551DCEFFD0>
print(jack.Age)
#5

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

Также стоит отметить, что метод инициализатора вызывается автоматически после создания объекта. Этот аспект можно продемонстрировать, распечатав значение атрибута «Возраст». Вы можете сделать то же самое с остальными атрибутами.

4. Магический метод

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

class Dog:
    def __init__(self,name,breed,age):
        self.Name = name
        self.Breed = breed
        self.Age = age
    def __repr__(self):
        return "Name: {}, Breed: {}, Age: {}".format(self.Name,
                                           self.Breed,self.Age)

Метод __repr__ принимает уникальный параметр self, из которого он может получить доступ к атрибутам объекта.

jack = Dog('Jack','Husky',5)
print(jack)
#Name: Jack, Breed: Husky, Age: 5

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

5. Метод экземпляра

Методы экземпляра - это методы, принадлежащие классу. В качестве магических методов они принимают параметр self для доступа к атрибутам класса. Давайте посмотрим на пример:

class Dog:
    def __init__(self,name,breed,age,tired):
        self.Name = name
        self.Breed = breed
        self.Age = age
        self.Tired = tired
    def __repr__(self):
        return "Name: {}, Breed: {}, Age: {}".format(self.Name,
                                           self.Breed,self.Age) 
    def Sleep(self):
        if self.Tired==True:
            return 'I will sleep'
        else:
            return "I don't want to sleep"

В методе инициализатора мы добавили новый аргумент tired и, следовательно, новый атрибут Tired. После этого мы определяем новый метод под названием Sleep: если значение атрибута равно True, собака будет спать, в противном случае - нет.

jack = Dog('Jack','Husky',5,tired=False)
print(jack.Sleep())
#I don't want to sleep

Собака не устала, значит, не уснет.

Последние мысли:

В этом посте я кратко рассказал о классах Python. Надеюсь, вы сочли полезным закрепить свои знания о классах. Я не объяснял другие типы методов, статические методы и методы классов, так как хочу сосредоточиться на наиболее распространенных. Более того, еще одна интересная тема - Наследование классов, о которой я писал в другом посте. Спасибо за чтение. Хорошего дня!

Вам понравилась статья? Станьте участником и получайте неограниченный доступ к новым сообщениям о данных каждый день!