PyQt4

2012-07-22 23 views
7

के लिए __init__ का उपयोग करने के विभिन्न तरीके तो ... मैं PyQt4 का उपयोग कर मूल पायथन से कुछ जीयूआई प्रोग्रामिंग में स्थानांतरित करने की कोशिश करने पर काम कर रहा हूं। मैं कुछ अलग-अलग किताबों और ट्यूटोरियल देख रहा हूं, और उनमें से प्रत्येक वर्ग परिभाषा को दूर करने का थोड़ा अलग तरीका प्रतीत होता है।PyQt4

एक ट्यूटोरियल इतनी तरह कक्षाएं शुरू होता है:

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

एक और किताब इस तरह यह करता है:

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

और फिर भी एक और यह इस तरह से है:

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

मैं मैं अभी भी कक्षाओं और ओओपी और super() के आसपास अपने दिमाग को लपेटने की कोशिश कर रहा हूं और सब ... क्या मैं सोच में सही हूँ कि तीसरे उदाहरण की आखिरी पंक्ति पिछले वर्ग में स्पष्ट रूप से बेस क्लास को सीधे कॉल करके super() का उपयोग कर कॉल के समान ही कम करती है? अपेक्षाकृत सरल उदाहरणों के लिए, जैसे कि एकल विरासत, क्या कोई वास्तविक लाभ या दूसरा तरीका बनाम दूसरे तरीके का उपयोग करने का कारण है? अंत में ... दूसरा उदाहरण parent को super() पर तर्क के रूप में पास करता है जबकि पहला नहीं है ... किसी भी अनुमान/स्पष्टीकरण के लिए क्यों/कब/कहाँ उचित होगा?

उत्तर

8

पहला वाला बस अपनी बेस क्लास में parent तर्क उत्तीर्ण करने का समर्थन नहीं करता है। यदि आप जानते हैं कि आपको कभी भी parent तर्क की आवश्यकता नहीं होगी, तो यह ठीक है, लेकिन यह कम लचीला है।

चूंकि इस उदाहरण में केवल एक विरासत है, super(Example, self).__init__(parent) बिल्कुल QtGui.QDialog.__init__(self, parent) जैसा ही है; पूर्व का उपयोग करता है super, एक self की "संस्करण" कि calles QtGui.QDialog रों के Example के बजाय तरीकों ', ताकि self स्वचालित रूप से शामिल किया गया है प्राप्त करने के लिए, जबकि दूसरा सीधे समारोह QtGui.QDialog.__init__ कॉल करता है और स्पष्ट रूप से self और parent तर्क गुजरता है। एकल विरासत में टाइपिंग की मात्रा के अलावा AFAIK कोई अंतर नहीं है और तथ्य यह है कि यदि आप विरासत बदलते हैं तो आपको कक्षा का नाम बदलना होगा। एकाधिक विरासत में, super विधियों को अर्द्ध बुद्धिमानी से हल करता है।

तीसरा उदाहरण वास्तव में का उपयोग QDialog के बजाय करता है, जो थोड़ा अजीब है; संभवतः यह काम करता है क्योंकि QDialogQWidget का उप-वर्ग है और __init__ में सार्थक कुछ भी नहीं करता है, लेकिन मुझे निश्चित रूप से पता नहीं है।

+0

आप एक * तेज * उत्तर टाइपर हैं - मेरे आगे – Hubro

+1

@ कोडमनीकी सवाल पूछने के 7 मिनट बाद, * तेज़ नहीं। :) – Dougal