2010-04-28 12 views
8

सभी एक निश्चित आधार वर्ग से व्युत्पन्न वर्ग एक विशेषता "पथ" कहा जाता है परिभाषित करने के लिए किया है। बतख टाइपिंग के अर्थ में मैं उपवर्गों में परिभाषा पर भरोसा कर सकते हैं:बेस क्लास कन्स्ट्रक्टर को पैरामीटर पास करना या इंस्टेंस वैरिएबल का उपयोग करना?

class Base: 
    pass # no "path" variable here 

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

एक और possiblity आधार वर्ग निर्माता का उपयोग करने के होगा:

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

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

मैं अजगर 3.1 का उपयोग करें।

आप क्या पसंद करते हैं और यही कारण है कि होगा? क्या कोई बेहतर तरीका है?

उत्तर

11

अजगर 3.0+ में: जैसे आप दूसरे उदाहरण में है
मैं आधार वर्ग के निर्माता के लिए एक पैरामीटर के साथ जाना होगा। चूंकि यह आवश्यक वर्ग संपत्ति प्रदान करने के लिए बेस से प्राप्त कक्षाओं को मजबूर करता है, जो इस तथ्य को दस्तावेज करता है कि कक्षा में ऐसी संपत्ति है और व्युत्पन्न कक्षाएं इसे प्रदान करने की आवश्यकता है। इसके बिना, आप, अपने वर्ग के docstrings में कहीं यह कहा जा रहा है पर निर्भर होता जा (और पढ़ें), हालांकि यह निश्चित रूप से भी docstring क्या विशेष संपत्ति का मतलब है में राज्य के लिए मदद करता है।

अजगर में 2.6+:
मैं ऊपर में से कोई भी प्रयोग करेंगे; बजाय मैं का प्रयोग करेंगे:

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

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

दूसरे शब्दों में, मैं, आधार वर्ग के निर्माता में इस तरह के एक पैरामीटर की आवश्यकता होती है, क्योंकि यह तथ्य यह है कि इस तरह के सभी प्रकार होगा/उपयोग/कि विशेष रूप से पैरामीटर की आवश्यकता दस्तावेजों होता है और उस पैरामीटर साबित होने की जरूरत है। हालांकि, मैं super is somewhat fragile and dangerous in Python के रूप में सुपर() का उपयोग नहीं होता है, और मैं भी वस्तु से (या कुछ अन्य नई शैली से) वर्ग इनहेरिट से बेस एक new-style class होगा।

+5

वहाँ 'सुपर के बारे में कुछ भी नहीं है कमजोर()'। नाजुकता 2.x वाक्यविन्यास में है, जिसे 3.x में तय किया गया है (जिसे ओपी उपयोग कर रहा है, जैसा कि 'सुपर()' कॉल द्वारा दिखाया गया है), और सामान्य रूप से एकाधिक विरासत। पाइथन 3.x में सीधे बेसक्लास विधि को कॉल करने का कोई कारण नहीं है, 'सुपर() .__ init (...)' वाक्यविन्यास कभी भी खराब नहीं होता है और अक्सर बेहतर होता है। –

+0

'super' के उपयोग के द्वारा पहचानने, मुझे लगता है चाहते हैं कि deamon @Thomas Wouters py3k – SilentGhost

+0

उपयोग कर रहा है: कैसे आप सुपर प्रयोग करेंगे यदि आप अलग अलग निर्माता हस्ताक्षरों के साथ सभी एकाधिक वंशानुक्रम और आधार वर्ग? व्युत्पन्न कक्षाओं के सभी तर्कों को सभी आधार वर्गों में पास करना एक गंदे हैक जैसा दिखता है, नामित पैरामीटर पर निर्भर करता है और बेस क्लास को जो कुछ चाहिए उसे हल करने देता है, वह बहुत अच्छा नहीं है। – kriss

संबंधित मुद्दे