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
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)"
Якщо в методі класу потрібно повертати цей клас, то треба імпортувати або:
або (для версії 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)))