PyQt4

2012-07-22 21 views
7

için __init__ kullanmanın farklı yolları Bu yüzden PyQt4 kullanarak temel Python'dan GUI programlamaya geçmeye çalışıyorum. Birkaç farklı kitaba ve öğreticiye bakıyorum ve her birinin sınıf tanımını tekmelemenin farklı bir yolu var gibi görünüyor.PyQt4

Bir öğretici şöyle sınıflar başlar:

class Example(QtGui.QDialog): 
    def __init__(self, parent=None): 
     super(Example, self).__init__(parent) 

Ve yine başka bu şekilde yapar:

class Example(QtGui.QDialog): 
    def __init__(self): 
     super(Example, self).__init__() 

başka kitap, bunu böyle

class Example(QtGui.QDialog): 
    def__init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 

I Hala aklımı sınıfları ve OOP ve super() etrafında sarmaya çalışıyorum ve tüm ... düşünürken düzelttim Üçüncü örnekteki son satır, temel sınıfı doğrudan doğrudan arayarak, önceki kullanıcılarda super() kullanarak yapılan çağrılarla aynı şeyi gerçekleştirir mi? Bunlar gibi nispeten basit örnekler için, yani tek miras olarak, diğerine karşı tek yönlü kullanım için herhangi bir gerçek fayda veya sebep var mıdır? Son olarak ... ikinci örnek parent'u super()'a bir argüman olarak geçirirken, ilk olarak ... neden/neden/nerede uygun olacağı ile ilgili herhangi bir tahminde bulunma/açıklama yapmıyor mu?

cevap

8

Birincisi, temel sınıfına bir parent argümanı geçirmeyi desteklemiyor. parent arg'e asla ihtiyacınız olmayacağını biliyorsan, bu iyi, ama bu daha az esnek.

Bu örnekte yalnızca tek bir miras var olduğundan, super(Example, self).__init__(parent) tam olarak QtGui.QDialog.__init__(self, parent) ile aynıdır; İkincisi doğrudan self ve parent argümanları geçer açıkça işlevini QtGui.QDialog.__init__ çağırır ve süre eski kullanımları super, otomatik olarak dahil edilir self böylece s QtGui.QDialog 'yerine Example s yöntemleri' calles self bir "sürümünün" için. Tek bir kalıtımda, yazım miktarından farklı olarak AFAIK ve mirasınızı değiştirirseniz sınıf adını değiştirmeniz gerçeği arasında bir fark yoktur. Birden fazla kalıtımda, super yarı zekice yöntemleri çözer.

Üçüncü örnek aslında QDialog yerine QWidget kullanır; bu biraz garip; Muhtemelen bu QDialogQWidget bir alt sınıf ve __init__ onun anlamlı bir şey yapmaz çünkü çalışır, ama emin değilim.

+0

Bir * hızlı * yanıt yazım yolu önünüzdeyim – Hubro

+1

@Codemonkey Soruyu sorduktan 7 dakika sonra, * bu * hızlı. :) – Dougal