SORU
19 HAZİRAN 2009, Cuma


Python miras ne anlamı var?

Ben bu soru uzun olduğu için özür dilerim. Bu bir süre önce yaptığım bir blog yazısı yer alırken, bir okuyucu bana stackoverflow göndermek için önerdi. Biraz da olsa gördüm.

Aşağıdaki durum olduğunu varsayalım

#include <iostream>

class Animal {
public:
    virtual void speak() = 0;
};

class Dog : public Animal {
    void speak() { std::cout << "woff!" <<std::endl; }
};

class Cat : public Animal {
    void speak() { std::cout << "meow!" <<std::endl; }
};

void makeSpeak(Animal &a) {
    a.speak();
}

int main() {
    Dog d;
    Cat c;
    makeSpeak(d);
    makeSpeak(c);
}

Gördüğünüz gibi, makeSpeak genel Hayvan bir nesne kabul eden bir rutin. Bu durumda, Hayvan sadece saf sanal bir yöntem içerdiği için bir Java arayüzü oldukça benzer. makeSpeak elden ele dolaşsın Hayvan doğasını bilmez. Sadece sinyal gönderir “” ve geç bağlama aramak için hangi bakmak kalıyor::: ya konuş Kedi() Köpek::speak(). Bu, makeSpeak ilgili olarak, Alt sınıf aslında geçirilir bilgiye ilgisiz olduğu anlamına gelir.

Ama Python ne olacak? Hadi Python aynı dava için kod bakın. Lütfen bir an için C davası için mümkün olduğu kadar benzer olmaya çalışırım not:

class Animal(object):
    def speak(self):
        raise NotImplementedError()

class Dog(Animal):
    def speak(self):
        print "woff!"

class Cat(Animal):
    def speak(self):
        print "meow"

def makeSpeak(a):
    a.speak()

d=Dog()
c=Cat()
makeSpeak(d)
makeSpeak(c)

Şimdi, bu örnekte aynı stratejiyi göreceksiniz. Kaldıraç Kedi ve Köpeklere hiyerarşik kavram Hayvan oldukları için miras kullanın. Ama Python bu hiyerarşi gerek yok. Bu eşit derecede iyi çalışır

class Dog:
    def speak(self):
        print "woff!"

class Cat:
    def speak(self):
        print "meow"

def makeSpeak(a):
    a.speak()

d=Dog()
c=Cat()
makeSpeak(d)
makeSpeak(c)

Python sinyal “herhangi bir nesne”. konuş gönderebilirsiniz Eğer nesne ile başa çıkmak için mümkün olup olmadığını, uygulanacak, aksi halde bir özel durum neden olur. Her iki kodları sınıf bir Uçak ekleyin ve makeSpeak Uçak nesneyi göndermek varsayalım. C durumunda, Uçak Hayvandan türetilmiş bir sınıf değil gibi derleme değil. Python bu durumda, beklenen bir davranış olabilir, hatta çalışma zamanı, bir özel durum neden olur.

Diğer tarafta MouthOfTruth bir sınıf eklemek bir yöntem konuşmak varsayalım(). C harf, ya da sen-ecek var yeniden Düzenle hiyerarşi, ya da sen-ecek var tanımlamak için farklı bir yöntem makeSpeak kabul MouthOfTruth nesneler, ya da java olabilir özü davranışı içine bir CanSpeakİface ve gerçekleştir arabirimi için her. Pek çok çözüm var...

İşaret etmek istediğim şey, henüz Python miras (özel durumlar çerçeveleri ve ağaçlar ayrı, ama alternatif stratejiler var sanırım) kullanmak için tek bir neden bulamadım. polymorphically gerçekleştirmek için temel türetilmiş bir hiyerarşi uygulamak gerek yok. İsterseniz, miras için yeniden uygulanması, başarmak aynı ile çevreleme ve heyetiyle yararı bu düzelttirip, çalışma zamanında ve net bir şekilde tanımlamak arayüzü bulunan, riski olmadan istenmeyen yan etkileri.

Sonunda soru duruyor: bu yüzden Python miras ne anlamı var?

Editçok ilginç cevaplar için teşekkürler. Gerçekten de kodu yeniden kullanabilirsiniz, ancak uygulama yeniden ne zaman ben her zaman dikkatliyimdir. Genel olarak, çok sığ miras ağaçlar ya da ağaç hiç olmadı, ve eğer bir işlevi ortak ise ortak bir modül rutin olarak yeniden oluşturulması ve daha sonra her nesne arayın. Değişim tek bir noktadan (örn. sahip olmanın avantajı görüyorum yerine ekleme için Köpek, Kedi, Geyik ve bu yüzden, ben sadece eklemek Hayvan olan temel avantajı miras), fakat elde edebilirsiniz aynı ile bir heyet zinciri (örn. a la JavaScript). Sadece başka bir yol olsa daha iyi olduğumu iddia etmiyorum.

Ben de bu konuda üzerine a similar post bulundu.

CEVAP
19 HAZİRAN 2009, Cuma


Senin bahsettiğin çalışma zamanı ördek yazarak "geçersiz kılma" miras, ancak inanıyorum miras kendi yararları gibi bir tasarım ve uygulama yaklaşımı, olmanın bir parçası olan nesne yönelimli tasarım. Benim naçizane görüşüm, sorunun olup olmadığını elde edebilirsiniz başka bir şey değil, çok önemli, çünkü aslında olabilir kod Python olmadan sınıfları, fonksiyonları ve daha fazla, ama soru ne kadar iyi tasarlanmış, sağlam ve okunabilir kod olacak.

Miras bence doğru bir yaklaşım olduğu, daha vardır eminim için iki örnek verebilirim.

İlk olarak, eğer kod akıllıca, makeSpeak işlevi de doğrulayan girdisini gerçekten bir Hayvan, ve sadece "burası anlatıyor" bu durumda, en şık yöntem olurdu için kullanmak miras. Yine, başka şekillerde yapabilirsin, ama kalıtım ile nesne yönelimli tasarım güzelliği kodunuzu "" giriş olup olmadığını kontrol edin"". hayvan gerçekten

İkinci, ve açıkça daha basit, Saklama - nesneye dayalı tasarımın başka bir parçası. Bu ata veri üyeleri ve/veya soyut olmayan yöntemler varsa ilgili olur. Hangi atanın o zaman soyut bir işlevi çağıran bir işlev (speak_twice) şu aptal örnek:

class Animal(object):
    def speak(self):
        raise NotImplementedError()

    def speak_twice(self):
        self.speak()
        self.speak()

class Dog(Animal):
    def speak(self):
        print "woff!"

class Cat(Animal):
    def speak(self):
        print "meow"

"speak_twice" varsayarsak önemli bir özellik ise, her iki Köpek ve Kedi kod istemiyorum, ve bu örnek, tahmin edebilirsiniz eminim. Emin, sen-ebil uygulamak bir Python tek başına bir işlevi olduğunu kabul edecek bazı ördek-yazılı nesne, kontrol edip bir konuşma işlevini çağırmak ve iki kez, ama her ikisi de olmayan şık ve özlüyor nokta sayısı 1 (doğrulamak Hayvan). Daha da kötüsü, ve Saklama örnek güçlendirmek için, alt sınıfın bir üye fonksiyonu "speak_twice" kullanmak isterse ne olacak?

Alır daha da net eğer üst sınıf bir veri üyesi, örneğin "number_of_legs" tarafından kullanılan soyut olmayan yöntemler içinde atası gibi "print_number_of_legs" ama başlatılan bu alt sınıf' kurucu (örneğin Köpek olur atamanız ile 4 ise Yılan olur atamanız 0).

Bir daha, sonsuz daha fazla örnek vardır eminim, ama katı nesne yönelimli tasarım dayalı (yeterince büyük) temelde her yazılım miras gerektirir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ordetta Price

    Ordetta Pric

    12 EYLÜL 2011
  • thelonelyisland

    thelonelyisl

    23 Aralık 2005
  • Whizzpopping

    Whizzpopping

    10 Kasım 2005