2011-05-17 20 views
26

Bu doğru mu benPython Metodu geçersiz kılıyor, imza konusu mu?

class Super(): 
    def method1(): 
    pass 

class Sub(Super): 
    def method1(param1, param2, param3): 
     stuff 

var Diyelim? Yöntem1 çağrıları her zaman alt sınıfa gidecek mi? Benim planım, her bir alt sınıf metodu herbir farklı yöntemle

cevap

1

geçersiz kılar. Python'da tüm sınıf yöntemleri "sanal" (C++ cinsinden) şeklindedir.

class Super(): 
    def method1(self): 
     pass 

class Sub(Super): 
    def method1(self, param1, param2, param3): 
     super(Sub, self).method1() # a proxy object, see http://docs.python.org/library/functions.html#super 
     pass 

Ve yöntemi imzası önemi var: Yani, kod durumda, süper sınıfta method1() aramak istiyorum, eğer olmak zorunda. Böyle bir yöntemi diyemezsin:

sub = Sub() 
sub.method1() 
25
yüzden Python bu izin verir, ancak method1() dış koddan yürütülecek amaçlanıyorsa bunun LSP ihlal olarak o zaman, bu yeniden isteyebilirsiniz ve

olmaz her zaman düzgün çalışır.

+0

Super.method1 alırken Sub.method1 3 argüman alır gerçeği LSP ihlali midir hiçbiri farklı aslında bunları yaparken arayüzleri? – Unode

+1

@Unode: Doğru. Bu, alt sınıfın yönteminin argümanlarının hepsinin varsayılan değerlere sahip olmasıyla çözülebilir, ancak sonra hangi varsayılanların uygun olacağını görürsünüz. –

+2

Anladım. Ama sonra sadece açıklığa kavuşturmak için. Eğer üst metot1 Super.method1 olarak tanımlandıysa (param1 = Yok, param2 = Yok, param3 = Yok) 'alt sınıflarda“ Sub.method1 (param1, param2, param3) ”olarak tanımlanmışsa, yine de LSP'yi ihlal ederdi? Nitelikler bir durumda zorunlu, diğeri değil. Bundan dolayı, alt sınıf arayüzünü değiştirmeden anladığım kadarıyla, LSP'yi ihlal etmemenin tek yolu, üstte varsayılan değerler olmaksızın parametreleri sahip olacaktır. Bunu düzeltiyor muyum yoksa LSP'yi aşırı yorumluyor muyum? – Unode

-2

Evet. "Method1" e yapılan çağrılar her zaman alt sınıfa gidecek. Python'da metot imzası sadece argüman listesinden değil isminden oluşur.

+2

Yanlış yanıt. Yöntem imzası her zaman önemlidir, çünkü C/C++ olduğu için aşırı yüklenme yoktur. –

+0

Demek istediğim, Python hangi yöntemin kullanılacağına karar vermek için argüman listesini düşünmüyor, ama sanırım _that_ açıdan bakarken haklısınız! – Elektito

1

varsayılan argümanlar kullanmaya uygun olup olmadığını Böyle bir şey yapabileceğini:

>>> class Super(): 
... def method1(self): 
...  print("Super") 
... 
>>> class Sub(Super): 
... def method1(self, param1="X"): 
...  super(Sub, self).method1() 
...  print("Sub" + param1) 
... 
>>> sup = Super() 
>>> sub = Sub() 
>>> sup.method1() 
Super 
>>> sub.method1() 
Super 
SubX 
İlgili konular