2011-06-09 33 views
6

Ben bir sınıf vardır: AyrıcaKatmalar, çoklu kalıtım, kurucular ve veri

class A(object): 
    def __init__(self, *args): 
     # impl 

bir "mixin", bazı veri ve yöntemlerle temelde başka sınıfı: Şimdi oluşturmak

class Mixin(object): 
    def __init__(self): 
     self.data = [] 

    def a_method(self): 
     # do something 

mixin ile a sınıfının bir alt sınıfı:

class AWithMixin(A, Mixin): 
    pass 

sorunum a ve mixin ait kurucular hem denir istemen. AWithMixin'e, süperin çağrıldığı kendi kurucusunu vermeyi düşündüm, fakat süper sınıfların kurucuları farklı argüman listelerine sahipler. En iyi çözünürlük nedir?

+1

İki temel sınıfın yapıcılarını çağırmaktan ne beklemelisiniz? gings) 'AWithMixin .__ init__'? – NPE

+0

Bu, daha önce derinlemesine yanıtlandı. En iyi çözüm olan http://stackoverflow.com/a/6100595/763269 –

cevap

8

Ben de OOP için oldukça yeni, ancak bu kodu sorun nedir:

class AWithMixin(A, Mixin): 
    def __init__(self, *args): 
     A.__init__(self, *args) 
     Mixin.__init__(self) 
+2

adresine bakın ve her zaman kullanıyorum. Ancak, hem 'A' hem de 'Mixin' bazı sınıfları (örn. 'Base') genişletir ve her ikisi de 'Base .__ init __() 'işlevini çağırırsa, [super() fonksiyonunu kullanmak zorunlu olabilir (http: // stackoverflow. com/Q/576.169). Bu karmaşık bir IMHO'dur ve bunu bilmenizi öneririm, ancak mümkünse kaçın. – brandizzi

+0

@brandizzi, cevabımda dediğim gibi, OOP'a yeniyim. Süper fonksiyona baktım ama anlamadım. Bu sınıfta [code] super (AWithMixin, self) .__ init __() [/ code] dediğimde, A .__ init__ ve Mixin .__ init__ her ikisini de nasıl arayabilirim? Ve farklı argümanlar belirtin? – utdemir

+1

Sorun, bu çözümün özellikle genişletilemez olması ve kapsülleme noktasını tamamen yok sayması ve karışımın yanlış sırada olduğunu belirtir. Bir karıĢımdaki yöntemleri geçersiz kılmak isterseniz, o karıĢık bu yöntem üzerinde kontrole sahip olur ve aynı yöntemi süper sınıfta aramaktan sorumlu olmalıdır. Karışımın farklı bir argüman listesi alması, yanlış kodlanmış/bu çocuk sınıfıyla kullanılmak üzere tasarlanmamış olduğunu - [LSP] ihlal edildiğini (http://en.wikipedia.org/wiki/Liskov_substitution_principle) gösterir. . – quodlibetor

10
class A_1(object): 
    def __init__(self, *args, **kwargs): 
     print 'A_1 constructor' 
     super(A_1, self).__init__(*args, **kwargs) 

class A_2(object): 
    def __init__(self, *args, **kwargs): 
     print 'A_2 constructor' 
     super(A_2, self).__init__(*args, **kwargs) 

class B(A_1, A_2): 
    def __init__(self, *args, **kwargs): 
     super(B, self).__init__(*args, **kwargs) 
     print 'B constructor' 

def main(): 
    b = B() 
    return 0 

if __name__ == '__main__': 
    main() 
  1. A_1 yapıcısı
  2. A_2 yapıcısı
  3. B yapıcısı