2012-04-08 14 views
70

Yerleşik ve standart kütüphane sınıflarının alt sınıflar ("son") olmadığı konusunda herhangi bir kural var mı? Python 3.3 itibariyle Hangi sınıflar alt sınıflara eklenemez?

, burada birkaç örnek:
  • slice
    • bool
    • function
    • operator.itemgetter
    • Ben uygulanmasıyla ilgilenen question bulundu her ikisi de "final" dersleri C ve saf Python.

      Bir sınıfın niçin "final" olarak seçildiğini neden açıklayabileceğini anlamak isterim.

    +4

    "NoneType" başka bir örnektir. – Duncan

    +4

    Bir Python uygulamasında son sınıf başka bir uygulamada alt sınıf olabilir mi? Umarım birisi asla gerçekleşmeyeceğini doğrulayabilir. Aksi takdirde, bir uygulama için yazılan kod diğerine taşınırken bozulabilir (çok acı verici de olabilir: eğer birisi 'işlev' alt sınıfını sınıflandırırsa düşünün ve şimdi bu kalıtımı önlemek için kodu yeniden düzenlemelidir). – max

    +3

    Not: PyPy, dört örneğinizin de altını çizmeyi reddeder ... CPython kısıtlaması olmasa bile. Kod tabanlarında belgelenmiş bir nedeni olabilir. –

    cevap

    23

    Bir sınıfın Python'da "son" olmasının iki nedeni var gibi görünüyor. Singleton deseni takip

    sınıfları Değişmeyen Sınıf

    1. ihlali örneklerinin sınırlı bir (önceden-saptanmış) sayı var ki bir değişmez sahiptir. Bu değişmezin bir alt sınıfta herhangi bir ihlali, sınıfın amacı ile tutarsız olacaktır ve doğru şekilde çalışmayacaktır. Örnekler:

    • bool: True, False; Guido's comments
    • NoneType bkz: None
    • NotImplementedType: NotImplemented
    • ellipsis: Ellipsis

    Bu kategoride Singleton modeli dışındaki durumlar olabilir ama herhangi farkında değilim.

    2. Resim ikna edici Kullanım Durumu

    C uygulanan bir sınıf (en azından CPython olarak) subclassing izin vermek için ek bir çalışma gerektirir. Böyle bir işi ikna edici bir kullanım durumu olmadan yapmak çok çekici değildir, dolayısıyla gönüllülerin öne çıkması daha az olasıdır. Örnekler:

    Not 1: Başlangıçta geçerli kullanım durumlarını, fakat sadece yetersiz ilgi function ve operator.itemgetter ait subclassing orada, sanıyordum

    . Kullanım koşullarının here ve here tarafından sunulan kullanım koşullarının ikna edici olmadığına işaret etmek için @agf'ye teşekkürler (soruya @agf yorumlarına bakın).

    Not 2:

    Benim endişe başka Python uygulaması yanlışlıkla CPython final var bir sınıf sınıflara izin verebilir olmasıdır. Bu, taşınabilir olmayan kodla sonuçlanabilir (bir kullanım durumu zayıf olabilir, ancak birileri hala Python'u destekliyorsa function alt sınıfına kod yazabilir). Bu, Python belgelerinde, alt sınıflara eklenemeyen tüm yerleşik ve standart kitaplık sınıflarında işaretlenerek ve tüm uygulamaların bu anlamda CPython davranışına uymasını gerektirerek çözülebilir.

    Not 3: her şeyden önce durumlarda CPython tarafından üretilen

    mesajdır:

    TypeError: type 'bool' is not an acceptable base type 
    

    Bu konu gösteri sayısız soru olarak oldukça gizlenmiştir. Son sınıfları açıklayan belgelere bir paragraf eklemek için bir öneri gönderirim ve belki de hata iletisini şu şekilde değiştirebilirim:

    +3

    Elbette, Schrodinger'in Kedisinin bir benzetimini yazıyor olsaydınız, bool'unu "bilinmeyene" dahil etmek için alt sınıf olarak kullanmak isteyebilirsiniz: --P sadece – Endophage

    +8

    @Endophage ile dalga geçiyor: bir Qbit kesinlikle yararlı bir tür olurdu, ama bu bir alt kümesi değil. bool, aslında, tam tersi, her bir boolean değeri bir tür qbit! gözlemlenecek olan bir tane. Muhtemelen bu davayı '__subclasscheck__' ve arkadaşları ile halledebilirim. – SingleNegationElimination

    +4

    @TokenMacGuy mükemmel gözlem! Öyleyse neden Python'da bir Qbit sınıfına sahip değiliz ki bool bir alt sınıftır! Bunun olması gerektiğini talep ediyorum! : -P – Endophage

    İlgili konular