Всё, что нужно знать о классах Python!

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

Чёткость, лёгкость в понимании и в то же время мощь — нигде больше не проявляются эти принципы так, как в классах Python.

Класс Python

Почти всё в Python можно назвать объектом. И у каждого объекта, естественно, есть свои характеристики, свойства и функции.

Мы можем считать класс неким «макетом» для создания объектов. Точнее сказать — нашим собственным специально настраиваемым макетом. А раз мы сами под себя его настраиваем, то и задавать ему можем любые характеристики, свойства и функции!

Начнём с простого примера. Создадим класс со свойством «x», где x=10. Вот определение нашего класса:

class my_class:
x = 10

Вот и всё! Мы создали наш первый класс Python my_class со свойством x и значением 10. Чтобы использовать класс, вызываем нашу функцию. Дальше мы можем обращаться к любым свойствам класса по отдельности.

class my_class:
  x = 10

c_1 = my_class()
print(c_1.x)

Данный код выводит число 10. Всё просто!

Ещё мы можем поменять переменную, просто присвоив ей новое значение. Вместо того, чтобы x был равен 10, пусть он равняется строке «Bob».

class my_class:
  x = 10

c_1 = my_class()
c_1.x = "Bob"
print(c_1.x)

Функция __init__()

У всех классов есть функция __init__(). Её можно менять в любое время. Функция __init__()выполняется всякий раз, когда из класса создаётся объект. Она может использоваться для инициализации переменных класса. __init__()становится очень полезной, когда нам нужно, чтобы класс Python всегда начинался с тех или иных свойств.

В качестве примера возьмём следующий код:

class Person:
  def __init__(self, name, gender):
    self.name = name
    self.gender = gender
    self.country = "USA"

person_1 = Person("Bob", "Male")
person_2 = Person("Kate", "Female")

print(person_1.name)
print(person_1.gender)
print(person_1.country)

print(person_2.name)
print(person_2.gender)
print(person_2.country)

Здесь у нас есть два человека с классом Person и именами Bob и Kate (типа мы их создали). В обоих классах исполнялась функция __init__(), инициализируя переменные класса для имени, пола и страны человека.

Что касается имени и пола, мы передали классу свои переменные, которые требовались в __init__(). Переменная «страна» инициализировалась при создании объекта в этой же функции, но с одним отличием: по причине того, что она не является переменной функции __init__(), значение не может быть задано извне. Поэтому у всех будет одна страна — США.

Результат этого кода будет такой:

Bob
Male
USA
Kate
Female
USA

Функции класса

Как любой объект, классы Python могут содержать функции! Находясь внутри класса, функции ведут себя точно так же, как вне его. Единственное отличие — способность функций класса обращаться непосредственно к переменным класса, не принимая их в качестве аргументов.

class Person:
  def __init__(self, name, gender, age):
    self.name = name
    self.gender = gender
    self.age = age
    
    self.country = "USA"
    
  def print_info(self):
    print("Name: {}".format(self.name))
    print("Gender: {}".format(self.gender))
    print("Age: {}".format(self.age))
    print("Country: {}".format(self.country))
    
  def grow_person(self, years_of_growth):
    self.age = self.age + years_of_growth
    
    
def grow_person(current_age, years_of_growth):
  return current_age + years_of_growth


# определение человека
person_1 = Person("Bob", "Male")

# вывод всей информации о Бобе по каждому свойству
print("Name: {}".format(person_1.name))
print("Gender: {}".format(person_1.gender))
print("Age: {}".format(person_1.age))
print("Country: {}".format(person_1.country))

# вывод всей информации о Бобе с помощью функции класса
person_1.print_info()

# использование внешней функции
person_1.age = grow_person(person_1.age, years_of_growth=5)

# использование функции класса
person_1.grow_person(years_of_growth=5)

Первая функция класса встречается в строке 9 print_info(), которая выводит всю информацию о нашем объекте Person. Заметьте, что теперь, используя переменные класса с self, мы можем получить информацию о Бобе из любого места класса! Теперь, когда у нас есть прямой доступ ко всей информации, применять функции к объектам Python стало намного удобнее.

С другой стороны, трудно не заметить, как много кода нам требуется для отображения информации о Бобе с использованием print() в Python. Ну и наличие функций, специально предназначенных для того, чтобы конкретный тип-класс определялся в рамках этого класса, лучше организует код.

Вторая функция, которую мы здесь написали, называется grow_person(). Она увеличивает возраст человека на заданное пользователем количество лет. Логично сделать её функцией класса, так как она связана с нашим классом Person. Код в конечном итоге выглядит гораздо более чистым и удобным для восприятия!

Заключение

Вот и всё. Вы прошли вводный курс, посвящённый классам Python.

Если вам этого мало, займитесь изучением программирования. Отлично подойдёт для начала вот этот сайт GeeksForGeeks website (Eng). Если вам нравятся приложения или вы предпочли бы записаться на какие-нибудь курсы, в Coursera есть курс Python for Everybody (Eng), в котором больше внимания уделяется приложениям.

Читайте также:


Перевод статьи George Seif: All the basics of Python classes

Предыдущая статьяЭффективное использование словаря (C#) как альтернатива оператору If
Следующая статьяОператор Spread и деструктуризация в JavaScript: практическое руководство