2010-04-28 14 views
8

Belli bir temel sınıftan türetilen tüm sınıfların "yol" adlı bir öznitelik tanımlaması gerekir. ördek yazmak anlamında bir alt sınıfları tanımı güvenmek olabilir:Alt sınıf yapıcısına veya örnek değişkenini kullanarak parametre geçiriliyor mu?

class Base: 
    pass # no "path" variable here 

def Sub(Base): 
    def __init__(self): 
     self.path = "something/" 

başka olasılıkları temel sınıf kurucu kullanmak olacaktır:

class Base: 
    def __init__(self, path): 
     self.path = path 

def Sub(Base): 
    def __init__(self): 
     super().__init__("something/") 

Python 3.1 kullanın.

Neyi tercih edersiniz ve neden? Daha iyi bir yolu var mı? Python 3.0+ yılında

cevap

11

: Eğer ikinci örnekteki var gibi
Ben temel sınıfın kurucusuna bir parametre ile gider. Çünkü, bu tür bir özellik ve türetilmiş sınıflara sahip olduğu gerçeğini belgeleyen gerekli yol özelliğini sağlamak için Base'den türeyen sınıfları zorlamak gerekir. O olmasaydı, sınıfın belgesellerinde bir yerde belirtilen (ve okunan) belgesine güvenirsiniz, ama yine de özel eşyaların ne anlama geldiğini belgelemeye de yardımcı olur.

2.6+ Python

:
Yukarıda hiçbiri kullanmak; bu tür tüm türleri// kullanımı var o parametrenin bulunması gerekir olduğunu belgelemektedir çünkü başka deyişle

class Base(object): 
    def __init__(self,path): 
     self.path=path; 

class Sub(Base): 
    def __init__(self): 
     Base.__init__(self,"something/") 

, ben, temel sınıfın yapıcı böyle bir parametreyi gerektirir ve parametre olduğunu: bunun yerine kullanmak uygun görülmesi gerekiyor. Ancak, super() öğesini super is somewhat fragile and dangerous in Python olarak kullanmazdım ve ayrıca Nesneyi new-style class nesnesinden nesneyi (veya başka bir yeni stil) sınıfından devralır.

+5

'super()' hakkında hassas bir şey yoktur. Kırılganlık, 3.x'te (OP'nin kullandığı, super() 'aramanın gösterdiği gibi) ve genel olarak birden fazla kalıtımla sabitlenen 2.x sözdizimindedir. Python 3.x'te doğrudan sınıflandırma yöntemini çağırmak için hiçbir neden yoktur, “super() .__ init (...)” sözdizimi asla daha kötü ve genellikle daha iyi değildir. –

+0

"süper" nin kullanımıyla yargılamak istiyorum, deamon'un py3k kullanıyor olduğunu tahmin ediyorum – SilentGhost

+0

@Thomas Wouters: Birden fazla miras ve temel kurumu farklı kurucu imzalarla birlikte kullanırsanız nasıl süper kullanırsınız? Türetilmiş sınıfların tüm argümanlarını tüm temel sınıflara iletmek, adlandırılmış parametrelere güvenerek kirli sınıflara benziyor ve temel sınıfların ihtiyaç duydukları şeyi daha güzel bir hale getirmesine izin vermiyor. – kriss

İlgili konular