2011-11-11 18 views
5

Başımı python'da birden fazla miras etrafında sarmalamaya çalışıyorum.Python'da aynı Temel Sınıflar ile Birden Fazla Kalıtım

varsayalım Aşağıdaki temel sınıf vardır:

class Structure(object): 
    def build(self, *args): 
     print "I am building a structure!" 
     self.components = args 

Ve en ondan devralan iki sınıfları var diyelim:

class House(Structure): 
    def build(self, *args): 
     print "I am building a house!" 
     super(House, self).build(*args) 

class School(Structure): 
    def build(self, type="Elementary", *args): 
     print "I am building a school!" 
     super(School, self).build(*args) 

Son olarak, bir çoklu miras kullanan bir sınıf oluşturmak:

class SchoolHouse(School, House): 
    def build(self, *args): 
     print "I am building a schoolhouse!" 
     super(School, self).build(*args) 

Daha sonra, bir SchoolHouse nesnesi oluşturun ve üzerinde build çalıştırın:

>>> sh = SchoolHouse() 
>>> sh.build("roof", "walls") 
I am building a schoolhouse! 
I am building a house! 
I am building a structure! 

Yani merak ediyorum - Ne School sınıfa oldu? Her nasılsa Python'u çalıştırmak için bir yol var mı?

Özellikle merak ettiğim, modellerde özel Managers sağlayan çok sayıda Django paketi var. Ancak, birini veya diğerini yönetmeden diğerini devralarak birleştirmenin bir yolu yoktur. Her ikisini de ithal etmek ve her iki şekilde de kullanmak güzel olurdu, ama yapılmayacak gibi görünüyor mu?

Ayrıca Python'da birden fazla kalıtımla ilgili iyi bir primere işaret edilmesine yardımcı olacağını düşünüyorum. Daha önce Mixins ile çalıştım ve bunları kullanmaktan gerçekten keyif aldım. Sanırım işlevselliği, aynı temel sınıftan kaldıkları zaman iki farklı sınıftan birleştirmenin herhangi bir şık yolu var mı diye merak ediyorum.

Yup, aptal ben. Her şey bir yazım hatasıydı. Kendimi çok aptal hissediyorum. Söz veriyorum, her zaman doğru sınıfta, gerçek hayatta süper olduğum zamanlar, sadece onu kesip dağıttığım zaman onu kesip yapıştırdığım zamanlardı.

+4

? Üst sınıflardan herhangi birini değil, alt sınıfı geçmeniz gerekiyor (diğer sınıflarda doğru şekilde yapıyorsunuz). – delnan

+1

Bu soruyu Django ile etiketlediniz, bu yüzden modellerle uğraştığınızı hayal ediyorum. Alan türleri olan özellikleri geçersiz kılamayacağınızı unutmayın ... Django size hatalar atacaktır. Daha fazla bilgi için bkz. Https://docs.djangoproject.com/en/dev/topics/db/models/#field-name-hiding-is-not-permitted. –

+2

Mükemmel bir astar için bkz. Raymond Hettinger'in [Süper göz önünde bulundurulan süper] (http://rhettinger.wordpress.com/2011/05/26/super-considered-super/). –

cevap

15

SchoolHouse numaralı super() numaralı telefon numaranız yanlıştır.

Öyle:

super(School, self).build(*args) 

Olmalıdır: Neden `SchoolHouse`` in'Okul ile super` aradığınız

super(SchoolHouse, self).build(*args) 
+0

Boo yazım hataları. Şuan çalışıyor. –

İlgili konular