Həm varislik, həm də kompozisiya kodu təkrar istifadə edir, lakin sinifləri fərqli şəkildə bağlayır. Varislik (is-a) alt sinfi baza sinfin daxili hissələrinə bağlayır. Kompozisiya (has-a) bir obyekti digərinin içində saxlayır və yalnız onun açıq interfeysindən istifadə edir. Əsaslar Kompozisiya və varislik dərsindədir; bu dərs dizayn qərarı haqqındadır.
Penguin Bird.fly metodunu miras alır və xəta atmalıdır; sağda Bird-də Mover var, onu Fly və Walk həyata keçirirVarislik nə vaxt əsaslıdır
- Həqiqi is-a. Hər alt sinif baza sinfin bütün vədlərini yerinə yetirir, ona görə baza sinfin gözlənildiyi hər yerdə istifadə oluna bilər: Liskov əvəzetmə prinsipi.
- Genişləndirmə üçün nəzərdə tutulmuş sabit baza:
Exception, abstrakt baza siniflər,unittest.TestCasekimi freymvork nöqtələri. - Dayaz ağac: bir-iki səviyyə.
class Bird:
def fly(self):
return "flap"
class Sparrow(Bird):
pass
class Penguin(Bird):
def fly(self):
raise NotImplementedError("penguins cannot fly")
for b in [Sparrow(), Penguin()]:
try:
print(type(b).__name__, b.fly())
except NotImplementedError as e:
print(type(b).__name__, "fails:", e)Sparrow flap
Penguin fails: penguins cannot flyPenguin yerinə yetirə bilmədiyi fly() metodunu miras alır. İndi Bird obyektləri üzərində dövr edən hər kod xüsusi hal tələb edir. Alt sinif miras alınmış metodda NotImplementedError atırsa və ya səssizcə heç nə etmirsə, "is-a" yalnız illüziya idi.