Herkese merhaba,
super fonksiyonunun tam olarak nasıl çalıştığını anlamaya çalışıyorum. Python’un resmi dokümanlarına baktım ama pek bir şey anladım diyemem. Ama anladıklarımı aktarmak istiyorum.
Şimdi konuyu anlamak için şu şekilde bir kod yazdım.
class A:
def print_msg(self):
print("Adana")
def kebab(self):
print("kebab from A")
class B:
def print_msg(self):
print("İstanbul")
class D:
def print_msg(self):
print("Mersin")
class C(B, A, D):
def print_result(self):
super().kebab() # B - A - D - object
super(A, self).kebab() # D - object
super().print_msg() # B - A - D - object
super(B, self).print_msg() # A - D - object
super(A, self).print_msg() # D - object
example = C()
example.print_result()
C classının mro(method resolution order)
'su B - A - D - object
şeklinde.
Anladığım kadarıyla super şu şekilde işliyor. (Örnek üzerinden anlatayım)
super().kebab()
da
- önce B de kebab methodu var mı diye bakılıyor.
- Eğer B de kebab diye bir method yoksa A da kebab methodu var mı diye bakılıyor.
- Eğer A da bu method yoksa D ye bakılıyor.
- Eğer D de de yoksa object classında kebab diye bir fonksiyon var mı diye bakılıyor.(ki olmadığı için de
AttributeError
veriyor.)
şimdi bu koddaki hata super(A, self).kebab()
dan kaynaklanıyor. Çünkü D classından başlıyor ve sağa doğru ilerliyor.
zaten sanki adı üstünde, method resolution order
(kaba bir türkçeyle method çözümleme sırası)
Ben olayı böyle anladım. Sizce olayı doğru bir şekilde anlamış mıyım? Söylemek istediğiniz ek bir şey olursa lütfen belirtin. Şimdiden teşekkür ederim.
Edit:
Aklıma sonradan şu şekilde sorular da takıldı.
super fonksiyonunun ilk parametresi class, ikinci parametresi instance olmak zorunda, neden ikinci parametresi instance olmak zorundadır?
Bu arada şu şekilde denemelerim daha odu.
class A:
def print_msg(self):
print("Adana")
def kebab(self):
print("kebab from A")
class B:
def print_msg(self):
print("İstanbul")
class D:
def print_msg(self):
print("Mersin")
class X(B, A, D): pass
class C(B, A, D):
def print_result(self):
super().kebab() # B - A - D - object
# super(A, self).kebab() # D - object
super().print_msg() # B - A - D - object
super(B, self).print_msg() # A - D - object
super(A, self).print_msg() # D - object
super(X, X()).kebab()
example = C()
example.print_result()
Bu ornekte mro ya direkt class tan erişebiliyoruz. Yani şöyle
x =X()
print(x.__class__.__mro__)
print(X.__mro__)
Yani instance olmasını gerektiren sebebi anlayamadım. Bana yardımcı olabilir misiniz?