दिलचस्प पोस्ट
NSDocumentDirectory को तेजी से कैसे खोजें? फ्रीटाइट्स के साथ एमबीआरओआरए आवाज़ – विंडोज़ ज: इनपुट टेक्स्ट जो स्ट्रिंग संपत्ति के लिए बाध्य है, शून्य की बजाय खाली स्ट्रिंग सबमिट कर रहा है Linux SUSE या RedHat पर, मैं पायथन 2.7 कैसे लोड कर सकता हूं गैजेट लिखने के लिए सी # ट्यूटोरियल मैं वीबी.नेट में कैसे काम करूं? जावास्क्रिप्ट ऑब्जेक्ट शाब्दिक सिंटैक्स त्रुटि सी # सिमुलेट कुंजी प्रेस क्यों चरित्र '^' को नजरअंदाज कर दिया है पायथन पापेन – कैसे Popen विंडोज में '^' चरित्र से बचने के लिए? UIButton कस्टम फ़ॉन्ट वर्टिकल संरेखण भूत-सीमाएं ('रिंगिंग') जब GDI + में आकार बदलता है एक अजगर मॉड्यूल आयात नहीं किया जा सकता जो निश्चित रूप से इंस्टॉल किया गया है (मशीनीज़) एंड्रॉइड: जांच कैसे करें कि क्या आवेदन पृष्ठभूमि में चल रहा है आयत-आयताकार चौराहे का क्षेत्रफल जावास्क्रिप्ट: setAttribute () बनाम element.attribute = मान सेट करने के लिए "नाम" विशेषता

पायथन: सुपरक्लास __इनट__ में प्रवेश करें

मेरे पास बहुत सारे __init__ तर्क के साथ एक बेस क्लास है:

 def BaseClass(object): def __init__(self, a, b, c, d, e, f, ...): self._a=a+b self._b=b if b else a ... 

सभी विरासत वर्गों को आधार वर्ग के __init__ पद्धति को चलाना चाहिए।

मैं __init__() कक्षाओं में से प्रत्येक में एक __init__() विधि लिख सकता हूं जो __init__() कहते हैं, लेकिन यह एक गंभीर कोड दोहराव होगा:

 def A(BaseClass): def __init__(self, a, b, c, d, e, f, ...): super(A, self).__init__(a, b, c, d, e, f, ...) def B(BaseClass): def __init__(self, a, b, c, d, e, f, ...): super(A, self).__init__(a, b, c, d, e, f, ...) def C(BaseClass): def __init__(self, a, b, c, d, e, f, ...): super(A, self).__init__(a, b, c, d, e, f, ...) ... 

स्वचालित रूप से superclass __init__ कॉल करने का सबसे पायथनिक तरीका क्या है?

Solutions Collecting From Web of "पायथन: सुपरक्लास __इनट__ में प्रवेश करें"

 super(SubClass, self).__init__(...) 

* एल्ग्स और ** केडब्ल्यू का उपयोग करने पर विचार करें यदि यह आपके चर दुःस्वप्न को हल करने में मदद करता है

आपको इसे स्पष्ट रूप से लिखना है, लेकिन दूसरी तरफ, यदि आपके पास बहुत सारे तर्क हैं, तो आपको शायद कंसल्टेंट्स के लिए एग्ज तथा स्थितिगत आर्गिक्स के लिए * क्वॉर्ग का उपयोग करना चाहिए।

 class SubClass(BaseClass): def __init__(self, *args, **kwargs): super(SubClass, self).__init__(*args, **kwargs) # SubClass initialization code 

आप उपयोग कर सकते हैं एक अन्य तकनीक को कम से कम init में कोड को कम करना है और फिर init फ़ंक्शन के अंत में, किसी अन्य कस्टम फ़ंक्शन को कॉल करें। तो उप-कक्षा में, आपको कस्टम फ़ंक्शन को ओवरराइड करना होगा

 class BaseClass(object): def __init__(self, *args, **kwargs): # initialization code self._a = kwargs.get('a') ... # custom code for subclass to override self.load() def load(): pass class SubClass(BaseClass) def load(): # SubClass initialization code ... 

यदि व्युत्पन्न कक्षाएं पहले से ही मूल कक्षा __init__() से परे कुछ भी लागू नहीं करती हैं, तो व्युत्पन्न कक्षाओं को छोड़ __init__() तरीके – मूल कक्षा __init__() तब स्वचालित रूप से कहा जाता है।

अगर, ओटोह, आपकी व्युत्पन्न कक्षाएं अपने __init__() में कुछ अतिरिक्त कार्य जोड़ते हैं, और आप उन्हें अपने आधार वर्ग __init__() को स्पष्ट रूप से कॉल नहीं करना चाहते, तो आप यह कर सकते हैं:

 class BaseClass(object): def __new__(cls, a, b, c, d, e, f, ...): new = object.__new__(cls) new._a=a+b new._b=b if b else a ... return new class A(BaseClass): ''' no __init__() at all here ''' class B(BaseClass): def __init__(self, a, b, c, d, e, f, ...): ''' do stuff with init params specific to B objects ''' 

चूंकि __new__() को स्वचालित रूप से हमेशा से कहा जाता है, व्युत्पन्न वर्गों में आगे कोई काम करने की आवश्यकता नहीं है।

जब तक आप subclass __init__() विधियों में उपयोगी कुछ नहीं कर रहे हैं, आपको इसे ओवरराइड नहीं करना होगा।

 def BaseClass(object): def __init__(self, a, b, c, d, e, f, ...): self._a=a+b self._b=b if b else a ... def A(BaseClass): def some_other_method(self): pass def B(BaseClass): pass 

2.6 और निम्न संस्करण में आधार वर्ग से init का वारिस करने के लिए, कोई सुपर फ़ंक्शन नहीं है, आप निम्न तरीके से वारिस कर सकते हैं:

 class NewClass(): def __init__(): BaseClass.__init__(self, *args) 

एक पायथनिक कार्यान्वयन जोड़ना मान लें कि आप सभी विशेषताओं में पारित करना चाहते हैं, तो आप नीचे दिए गए कोड का उपयोग कर सकते हैं। (यदि आप उप -सेट चाहते हैं तो भी विशिष्ट क्वार्ज कुंजी रख सकते हैं या हटा सकते हैं)

 def A(BaseClass): def __init__(self, *args, **kwargs): for key, value in kwargs.items(): setattr(self, key, value) base = BaseClass(...) new = A( **base.__dict__ )