अजगर: मैं सुपरक्लास से उपवर्ग कैसे बनाऊं?


86

पायथन में, आप सुपरक्लास से उपवर्ग कैसे बनाते हैं?


3
ध्यान दें कि पायथन ने आपके द्वारा उपवर्ग करने के तरीके को बदल दिया है, इसलिए इसे करने के 2 तरीके हैं, और वे मिश्रण नहीं करते हैं। मिक्स करने पर आपको एक एरर मिलेगी। अंतर देखने के लिए इस पोस्ट को पढ़ें: stackoverflow.com/questions/1713038/…
मार्क Lakata

जवाबों:


89
# Initialize using Parent
#
class MySubClass(MySuperClass):
    def __init__(self):
        MySuperClass.__init__(self)

या, इससे भी बेहतर, पायथन के बिल्ट-इन फ़ंक्शन का उपयोग, super()(इसके लिए पायथन 2 / पायथन 3 प्रलेखन देखें) आरंभीकरण के लिए माता-पिता को कॉल करने का एक बेहतर तरीका हो सकता है:

# Better initialize using Parent (less redundant).
#
class MySubClassBetter(MySuperClass):
    def __init__(self):
        super(MySubClassBetter, self).__init__()

या, शून्य तर्क फ़ॉर्म का उपयोग करने के अलावा, उपरोक्त के रूप में एक ही सटीक चीज़ super(), जो केवल एक वर्ग परिभाषा के अंदर काम करती है:

class MySubClassBetter(MySuperClass):
    def __init__(self):
        super().__init__()

6
OTOH, कुछ लोग superविशेष रूप से नए पायथन प्रोग्रामर (जैसे, लुत्ज़) के खिलाफ चेतावनी देते हैं । मैं इससे बचता हूं।
एरिक

6
बचने superका एकमात्र कारण यह है कि यदि आप superपायथन में कैसे काम करता है, और अन्य भाषाओं में कैसे super/ parentकाम करता है , के बीच अंतर नहीं समझते हैं। निश्चित रूप से यह अन्य भाषाओं से आने वाले लोगों के लिए स्पष्ट नहीं है, लेकिन मैं यह निष्कर्ष नहीं निकालूंगा कि यह "के खिलाफ सावधानी" के रूप में कुछ योग्य है। यह काम करता है । यह सिर्फ अलग तरह से काम करता है। इससे पहले कि आप वास्तव में पाइथन में क्या करते हैं, उसके बारे में पढ़ें इससे पहले कि आप उन परिणामों के बारे में शिकायत करें जिनसे आपको उम्मीद नहीं थी।
एटोमिक ऑक्शन

3
दोनों के बीच क्या अंतर है?
तिवारीव


65

एक छोटा सा उदाहरण:

class SuperHero(object): #superclass, inherits from default object
    def getName(self):
        raise NotImplementedError #you want to override this on the child classes

class SuperMan(SuperHero): #subclass, inherits from SuperHero
    def getName(self):
        return "Clark Kent"

class SuperManII(SuperHero): #another subclass
    def getName(self):
       return "Clark Kent, Jr."

if __name__ == "__main__":
    sm = SuperMan()
    print sm.getName()
    sm2 = SuperManII()
    print sm2.getName()

37
class MySubClass(MySuperClass):
    def __init__(self):
        MySuperClass.__init__(self)

        # <the rest of your custom initialization code goes here>

विरासत पर खंड अजगर दस्तावेज में और अधिक विस्तार में यह बताते हैं


5
आपको केवल उस __init__विधि को परिभाषित करने की आवश्यकता है यदि आप इसमें आगे कोड जोड़ना चाहते हैं, अन्यथा मूल init विधि का उपयोग वैसे भी किया जाता है (हालांकि यह ध्यान देने योग्य है, और पूरी तरह से मान्य कोड है)
dbr

2
मुझे लगता है कि यह सवाल काफी अस्पष्ट था कि मान लिया जाए कि आगे कोड जोड़ा जा सकता है। जब ओपी इसे लागू करता है तो पर्याप्त नहीं है और किसी अन्य प्रश्न के साथ समाप्त होने की तुलना में बहुत अधिक जानकारी प्रदान करने के लिए बेहतर है। :)
मैट डेवी

15
class Class1(object):
    pass

class Class2(Class1):
    pass

Class2 Class1 का एक उप-वर्ग है


ठंडा। यह वही है जो मैं वास्तव में देख रहा था, यानी सुपर के बिना कोई विस्तार / ओवरराइड के साथ एक उप वर्ग।
बुविनाज

9

ऊपर दिए गए उत्तरों में, superबिना किसी (कीवर्ड) तर्क के आरंभिक किया गया है। अक्सर, हालांकि, आप ऐसा करना चाहेंगे, साथ ही अपने स्वयं के कुछ 'कस्टम' तर्कों पर भी पास करेंगे। यहाँ एक उदाहरण है जो इस उपयोग के मामले को दिखाता है:

class SortedList(list):
    def __init__(self, *args, reverse=False, **kwargs):
        super().__init__(*args, **kwargs)       # Initialize the super class
        self.reverse = reverse
        self.sort(reverse=self.reverse)         # Do additional things with the custom keyword arguments

यह एक उपवर्ग है list, जब प्रारंभिक reverseपरीक्षण , तुरंत कीवर्ड तर्क द्वारा निर्दिष्ट दिशा में खुद को क्रमबद्ध करता है , जैसा कि निम्नलिखित परीक्षण उदाहरण हैं:

import pytest

def test_1():
    assert SortedList([5, 2, 3]) == [2, 3, 5]

def test_2():
    SortedList([5, 2, 3], reverse=True) == [5, 3, 2]

def test_3():
    with pytest.raises(TypeError):
        sorted_list = SortedList([5, 2, 3], True)   # This doesn't work because 'reverse' must be passed as a keyword argument

if __name__ == "__main__":
    pytest.main([__file__])

की पर गुजर के लिए धन्यवाद *argsकरने के लिए super, सूची प्रारंभ और बदले केवल खाली होने का आइटम के साथ भरा जा सकता। (ध्यान दें कि PEP 3102 केreverse अनुसार एक खोजशब्द-मात्र तर्क है )।


4

एक समारोह के साथ गतिशील रूप से अजगर में उपवर्ग बनाने का एक और तरीका है type():

SubClass = type('SubClass', (BaseClass,), {'set_x': set_x})  # Methods can be set, including __init__()

आप आमतौर पर इस पद्धति का उपयोग करना चाहते हैं जब मेटाक्लासेस के साथ काम करते हैं। जब आप कुछ निचले स्तर के आटोमेशन करना चाहते हैं, तो यह बताता है कि अजगर वर्ग कैसे बनाता है। सबसे अधिक संभावना है कि आपको इसे कभी भी इस तरह से करने की आवश्यकता नहीं होगी, लेकिन जब आप करते हैं, तो आप पहले से ही जानते होंगे कि आप क्या कर रहे हैं।





1
class BankAccount:

  def __init__(self, balance=0):
    self.balance = int(balance)

  def checkBalance(self): ## Checking opening balance....
    return self.balance

  def deposit(self, deposit_amount=1000): ## takes in cash deposit amount and updates the balance accordingly.
    self.deposit_amount = deposit_amount
    self.balance += deposit_amount
    return self.balance

  def withdraw(self, withdraw_amount=500): ## takes in cash withdrawal amount and updates the balance accordingly
    if self.balance < withdraw_amount: ## if amount is greater than balance return `"invalid transaction"`
        return 'invalid transaction'
    else:
      self.balance -= withdraw_amount
      return self.balance


class MinimumBalanceAccount(BankAccount): #subclass MinimumBalanceAccount of the BankAccount class

    def __init__(self,balance=0, minimum_balance=500):
        BankAccount.__init__(self, balance=0)
        self.minimum_balance = minimum_balance
        self.balance = balance - minimum_balance
        #print "Subclass MinimumBalanceAccount of the BankAccount class created!"

    def MinimumBalance(self):
        return self.minimum_balance

c = BankAccount()
print(c.deposit(50))
print(c.withdraw(10))

b = MinimumBalanceAccount(100, 50)
print(b.deposit(50))
print(b.withdraw(10))
print(b.MinimumBalance())

5
यह उत्तर अधिक उपयोगी होगा यदि आप इसमें यह व्याख्या शामिल करते हैं कि यह क्या करता है
नाली

4
यद्यपि यह कोड समस्या को हल करने में मदद कर सकता है, लेकिन यह इस बात की व्याख्या नहीं करता है कि क्यों और / या यह कैसे उत्तर देता है। इस अतिरिक्त संदर्भ को प्रदान करने से इसके दीर्घकालिक शैक्षिक मूल्य में काफी सुधार होगा। कृपया स्पष्टीकरण जोड़ने के लिए अपने जवाब को संपादित करें, जिसमें सीमाएं और मान्यताएं शामिल हैं।
टोबी स्पाइट

2
हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और वे लोग आपके कोड सुझाव के कारणों को नहीं जान सकते हैं।
andreas

0

अजगर में उपवर्ग निम्नानुसार किया जाता है:

class WindowElement:
    def print(self):
        pass

class Button(WindowElement):
    def print(self):
        pass

यहां अजगर के बारे में एक ट्यूटोरियल है जिसमें कक्षाएं और उपवर्ग शामिल हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.