Визначення та створення класу

Клас у Python — це шаблон, який об'єднує змінні (поля) і функції (методи) в єдину сутність. Це дозволяє створювати об'єкти з певними характеристиками та поведінкою. Клас можна уявити як форму для випічки, а об'єкти класу — як печиво, що випікається за цією формою, але з різними начинками.

class User:
    name = 'UserName'
    age = 15

Тут створено клас User з полями name та age.

Створення об'єктів

Об'єкти класу створюються шляхом виклику класу як функції. Об'єкти можуть мати різні значення полів, навіть якщо створені з одного класу.

user1 = User()
print(user1.name)  # 'UserName'
print(user1.age)   # 15

user2 = User()
user2.name = "John"
user2.age = 90

print(user2.name)  # 'John'
print(user2.age)   # 90

Атрибути класу (поля та методи)

Атрибути класу включають поля (змінні) і методи (функції). Методи працюють з полями класу та можуть мати доступ до них через параметр self.

class User:
    name = 'UserName'
    age = 15

    def say_name(self):
        print(f'Hi! I am {self.name} and I am {self.age} years old.')

    def set_age(self, age):
        self.age = age

bob = User()
bob.name = 'Bob'

bob.say_name()  # Hi! I am Bob and I am 15 years old.
bob.set_age(25)
bob.say_name()  # Hi! I am Bob and I am 25 years old.

Конструктор класу

Конструктор класу — це спеціальний метод __init__(), який викликається автоматично при створенні нового об'єкта. Він ініціалізує поля об'єкта.

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

    def greeting(self):
        return f"Hi {self.name}"

p = Person("Boris", 34)
print(p.name)  # Boris
print(p.age)   # 34
print(p.greeting())  # Hi Boris

Наслідування

Наслідування дозволяє створювати нові класи на основі існуючих, додаючи або перевизначаючи атрибути.

class Human:
    name = ''
    def voice(self):
        print(f"Hello! My name is {self.name}")

class Developer(Human):
    field_description = "My Programming language"
    language = ""
    def make_some_code(self):
        return f"{self.field_description} is {self.value}"

class PythonDeveloper(Developer):
    value = "Python"

class JSDeveloper(Developer):
    value = "JavaScript"

p_dev = PythonDeveloper()
p_dev.name = 'Bob'
p_dev.voice()   # Hello! My name is Bob
p_dev.make_some_code()  # My Programming language is Python

js_dev = JSDeveloper()
js_dev.make_some_code()  # My Programming language is JavaScript

Method Resolution Order (MRO)

MRO визначає порядок пошуку атрибутів у разі наслідування від кількох класів. Python шукає атрибут спочатку в класі, з якого створено об'єкт, потім у його батьківському класі, і так далі.

class A:
    x = 'I am A class'

class B:
    x = 'I am B class'
    y = 'I exist only in B'

class C(A, B):
    z = "This exists only in C"

c = C()
print(c.z)  # This exists only in C
print(c.y)  # I exist only in B
print(c.x)  # I am A class

Якщо змінити порядок наслідування, результат зміниться.