Перейти до змісту

Python OOP

__ - приватний атрибут @property - анотація getter @nameOfProperty.setter - анотація setter

class Human:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    def __del__(self):
        print('Destructor called, Human deleted.')

    def get_name(self):
        return self.__name

    @property
    def age(self):
        return self.__age

    def set_name(self, name):
        self.__name = name

    @age.setter
    def age(self, age):
        if 0 < age < 100:
            self.__age = age
        else:
            raise ValueError('Age must be between 0 and 100')

    def say_hello(self):
        print('Hello ' + self.__name)
        print('Age ' + str(self.__age))
from mypackage.Human import Human


def main():
    person = Human("Sam", 29)
    # person.set_age(-12)
    person.say_hello()

    print(person.age)
    person.age = -12
    print(person.age)


main()

Атрибути класу та атрибути екземпляру:

class Student:
    academy = "Mate academy"  # атрибут класу

    def __init__(self, name: str, course: str):
        self.name = name  # атрибут екземпляру
        self.course = course  # атрибут екземпляру


fe_student = Student("Joseph", "Frontend")
py_student = Student("John", "Python")

print(fe_student.name)  # Joseph
print(py_student.name)  # John
P.S. Доступ до атрибуту "academy" можливий лише в режимі ЧИТАННЯ. Якщо спробувати змінити його через об'єкт — це просто створить атрибут об'єкта з такою ж назвою і приховає атрибут класу. Ось так:
print(fe_student.__dict__)  # {'name': 'Joseph', 'course': 'Frontend', 'academy': 'MATE ACADEMY'}
print(py_student.__dict__)  # {'name': 'John', 'course': 'Python'}
print(Student.academy)  # Mate academy

Class Method

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

Метод класу може бути викликаний як через клас, так і через його об'єкт:

class Student:
    course = "python"

    @classmethod
    def change_student_course(cls, new_course: str):
        cls.course = new_course


Student.change_student_course("frontend")
print(Student.course)  # frontend

Static Method

Статичний метод не отримує неявний перший аргумент. Статичний метод також є методом, прив'язаним до класу, а не до об'єкта класу. Цей метод не може отримувати доступ до стану класу або змінювати його. Він присутній у класі, тому що логічно належить саме до цього класу.

Статичний метод також може бути викликаний як через клас, так і через його об'єкт:

class Car:
    @staticmethod
    def miles_to_km(miles: int):
        print(round(miles * 1.61, 2))

Car.miles_to_km(25) # 40.25
car = Car()
car.miles_to_km(25) # 40.25

Class Methods — коли потрібно працювати з атрибутами класу Static Methods — коли не потрібні ні self (об'єкт), ні cls (клас) атрибути

Magic Methods

Існує багато інших магічних методів, наприклад: __del__, __repr__, __str__, __add__, __eq__, __lt__, тощо.

class User:
    def __init__(self, name: str, surname: str):
        self.name = name
        self.surname = surname

    def __str__(self):
        return f"{self.name} {self.surname}"


user = User("Joseph", "Farrell")

print(user) # Joseph Farrell

__str__ — для зручного відображення, як "Joseph Farrell" __repr__ — для однозначного виводу для програміста, як "User(name=Joseph, surname=Farrell)"

Якщо в методі класу потрібно повертати цей клас, то треба імпортувати або:

from __future__ import annotations
або
from typing import Self
(для версії python 3.11 +)

from __future__ import annotations


class RockBand:
    def __init__(self, name: str, members: list[str]) -> None:
        self.name = name
        self.members = members



    def add_new_member(self, new_member: str) -> None:
        if new_member in self.members:
            print(f"{new_member} is already in the band!")
        else:
            self.members.append(new_member)


    def __add__(self, other: RockBand) -> RockBand:
        return RockBand(f"{self.name} {other.name} United", list(set(self.members + other.members)))