Об'єктно-орієнтоване програмування (OOP) побудоване навколо того, як класи та об'єкти взаємодіють між собою. У цьому блозі ми детальніше розглянемо чотири основні стосунки OOP: Асоціація, Агрегація, Композиція та Узагальнення. Ми пояснимо теоретичні концепції цих стосунків, надамо практичні приклади та покажемо, як ефективно використовувати їх у вашому коді. Наприкінці статті ви матимете чітке розуміння цих важливих концепцій і зможете застосовувати їх для проектування кращих систем.
Асоціація
Визначення: Асоціація представляє собою стосунки між двома класами, де один клас використовує або взаємодіє з іншим, але не володіє ним.
Сценарій: Вчитель може навчати багатьох студентів, а студент може навчатися у кількох вчителів.
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def _get_student_data(self):
print(f"{self.name} is {self.age} years old.")
class Teacher:
def __init__(self, name, subject, students):
self.name = name
self.subject = subject
self.students = students
def _get_teacher_details(self):
print(f"{self.name} is teaching {self.subject}")
def _teaching_students(self):
students_list = [student.name for student in self.students]
print(f"{self.name} is teaching all {students_list}")
if __name__ == "__main__":
student1 = Student("Varsha", 12)
student2 = Student("Shivansh", 17)
student1._get_student_data()
student2._get_student_data()
teacher = Teacher("Radhika", "Maths", [student1, student2])
teacher._get_teacher_details()
teacher._teaching_students()
вивід:
Varsha is 12 years old.
Shivansh is 17 years old.
Radhika is teaching Maths
Radhika is teaching all [‘Varsha’, ‘Shivansh’]
Пояснення асоціації:
- Відносини між студентом і вчителем (Асоціація):
- Вчитель має список студентів: Клас
Teacher
має списокstudents
, що означає, що кожен об'єктTeacher
знає про об'єктиStudent
, з якими він пов'язаний (тобто вчитель навчає студентів). - Взаємодія між студентом і вчителем: Об'єкт
Student
не "володіє" об'єктомTeacher
, і об'єктTeacher
не "володіє" об'єктомStudent
. Натомість вони взаємодіють — вчителі навчають студентів, а студенти вчаться у вчителів.
Відносини між класами в основному є взаємодією, а не власністю.
Агрегація
Визначення: Агрегація — це особливий тип асоціації, де один клас містить інший як частину, але ця частина може існувати незалежно від цілого.
class Wheel:
def __init__(self, company):
self.company = company
def get_wheel_details(self):
return f"This wheel is being manufactured by {self.company}."
class Car:
def __init__(self, model, wheels):
self.model = model
self.wheels = wheels
def get_car_details(self):
# Dictionary to store the count of wheels from each company
wheel_count = {}
# Counting how many wheels are from each company
for wheel in self.wheels:
wheel_count[wheel.company] = wheel_count.get(wheel.company, 0) + 1
# Printing details
print(f"{self.model} car has {len(self.wheels)} wheels:")
for company, count in wheel_count.items():
print(f" - {count} wheels from {company}")
if __name__ == "__main__":
# Create Wheel instances
wheel1 = Wheel("MRF")
wheel2 = Wheel("Goodyear")
wheel3 = Wheel("Bridgestone")
# Create Car instances
car1 = Car("Hyundai", [wheel1, wheel1, wheel1, wheel1]) # All MRF wheels
car2 = Car("TATA Harrier", [wheel1, wheel2, wheel2, wheel1]) # Mixed companies
car3 = Car("Ford Mustang", [wheel3, wheel3, wheel1, wheel1]) # Mixed companies
# Display car details
car1.get_car_details()
car2.get_car_details()
car3.get_car_details()
вивід:
Hyundai car has 4 wheels:
— 4 wheels from MRF
TATA Harrier car has 4 wheels:
— 2 wheels from MRF
— 2 wheels from Goodyear
Ford Mustang car has 4 wheels:
— 2 wheels from Bridgestone
— 2 wheels from MRF
Пояснення агрегації:
- Відносини агрегації:
- Клас Car містить список об'єктів Wheel. Це означає, що Car може мати кілька Wheel, але Wheel є незалежними та не належать до Car. Колесо може бути використане в різних автомобілях, і навіть якщо автомобіль знищується, колеса все ще існують і можуть бути використані в іншому автомобілі.
2. Незалежність коліс:
- Об'єкти Wheel створюються незалежно, а потім асоціюються з автомобілем. У прикладі використовуються кілька коліс від різних виробників (наприклад, MRF, Goodyear та Bridgestone), і ці колеса можуть існувати поза межами Car. Якщо автомобіль буде видалений з системи, колеса все одно залишаються та можуть бути призначені іншому автомобілю.
3. Відсутність власності:
- Агрегація не означає власність, тобто якщо Car буде видалено, об'єкти Wheel не будуть видалені. Вони можуть існувати незалежно від об'єкта Car. Колеса просто "належать" автомобілю в контексті їх асоціації, але вони не залежні від автомобіля.
Перекладено з: Mastering Object-Oriented Relationships: The Difference Between Association, Aggregation, Composition, and Generalization