Rozdział 14 · Tworzenie rzeczywistych obiektów
Kompozycja: Obiekty wewnątrz obiektów
Jeden obiekt może PRZECHOWYWAĆ inne obiekty, będąc za nie odpowiedzialnym – tak właśnie Uchastnik było uporządkowane w sekcji 14.4.
Cecha jako atrybut innej cechy
W rozdziale 14.4 klasa Uchastnik przechowywał obiekt
turtle.Turtle w twoim atributie self.t
– nie odziedziczyłem po nim, ale ZACHOWAŁEM to. Tak się nazywa skład:
jeden obiekt jest budowany Z innych obiektów, odpowiadając za nie.
Zasada nazewnictwa związku: HAS-A
Esej można łatwo sprawdzić, pytając "X is Y?" lub "X HAS Y?".
Uchastnik nie jest żółwiem (HAS-A prawda, IS-A fałsz) — dlatego jest to kompozycja, a nie dziedziczenie (o nim — w rozdziale 14.15).Graf obiektowy: kompozycja może iść w głąb
Obiekt może przechowywać nie tylko jeden obiekt, ale całe lista obiektów — i te własne Kolejka może przechowywać własne:
Zakaz
Tovar('Książka', 590)
Tovar('Rękawica', 90)
Tovar('Zeszyt', 120)
Debug Lab 7: Pomieszanie poziomu zagnieżdżania atrybutu
propushchennyj_uroven.py
class Mashina:
def __init__(self):
self.dvigatel = Dvigatel()
mashina = Mashina()
mashina.start() # i gdzie dokładnie jest zdefiniowana start()?
Traceback (most recent call last):
File "propushchennyj_uroven.py", line 5, in
mashina.start()
AttributeError: 'Mashina' object has no attribute 'start'
start() jest określana w Dvigatel, nie Mashina - Podczas komponowania metody zagnieżdżonego obiektu NIE stają się automatycznie metodami właściciela. Musisz uzyskać do niego dostęp jawnie, poprzez atrybut, w którym obiekt jest przechowywany.
Poprawiony kod
cherez_atribut.py
mashina.dvigatel.start() # wyraźnie: przez self.dvigatel
Praktyka: kompozycja
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji