मैं आधार (सुपर) वर्ग को कैसे शुरू करूं?
class SuperClass(object):
def __init__(self, x):
self.x = x
class SubClass(SuperClass):
def __init__(self, y):
self.y = y
super
विधि रिज़ॉल्यूशन ऑर्डर में आपको अगली विधि (एक बाध्य विधि के रूप में) प्राप्त करने के लिए एक ऑब्जेक्ट का उपयोग करें । पायथन 2 में, आपको self
बाउंड __init__
मेथड देखने के लिए क्लास का नाम और सुपर पास करना होगा :
class SubClass(SuperClass):
def __init__(self, y):
super(SubClass, self).__init__('x')
self.y = y
पायथन 3 में, थोड़ा जादू है जो तर्कों को super
अनावश्यक बनाता है - और एक पक्ष लाभ के रूप में यह थोड़ा तेज़ काम करता है:
class SubClass(SuperClass):
def __init__(self, y):
super().__init__('x')
self.y = y
नीचे दिए गए माता-पिता को इस तरह से हार्डकोर करना आपको सहकारिता के कई उत्तराधिकार का उपयोग करने से रोकता है:
class SubClass(SuperClass):
def __init__(self, y):
SuperClass.__init__(self, 'x') # don't do this
self.y = y
ध्यान दें कि __init__
केवल वापस आ सकता हैNone
- इसका उद्देश्य ऑब्जेक्ट को जगह में संशोधित करना है।
कुछ कुछ __new__
उदाहरणों को शुरू करने का एक और तरीका है - और यह पायथन में अपरिवर्तनीय प्रकारों के उपवर्गों का एकमात्र तरीका है। यदि आप उपवर्ग str
या करना चाहते हैं तो यह आवश्यक हैtuple
किसी अन्य अपरिवर्तनीय वस्तु को चाहते हैं।
आप सोच सकते हैं कि यह एक वर्गमंथन है क्योंकि इसमें एक अंतर्निहित वर्ग तर्क मिलता है। लेकिन यह वास्तव में एक स्टेथमिथोड है । तो अगर आप कॉल करने की आवश्यकता __new__
के साथ cls
स्पष्ट रूप से।
हम आमतौर पर उदाहरण से लौटते हैं __new__
, इसलिए यदि आप करते हैं, तो आपको अपने आधार के __new__
माध्यम से super
अपने आधार वर्ग में भी कॉल करना होगा । इसलिए यदि आप दोनों विधियों का उपयोग करते हैं:
class SuperClass(object):
def __new__(cls, x):
return super(SuperClass, cls).__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super(SubClass, cls).__new__(cls)
def __init__(self, y):
self.y = y
super(SubClass, self).__init__('x')
पायथन 3 __new__
स्थैतिक विधि से होने वाली सुपर कॉल्स की अजीबता को थोड़ा कम करता है , लेकिन फिर भी आपको cls
गैर-बाध्य __new__
विधि से गुजरना होगा :
class SuperClass(object):
def __new__(cls, x):
return super().__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super().__new__(cls)
def __init__(self, y):
self.y = y
super().__init__('x')