अजगर 3.x में अजगर की वस्तु से विरासत में आवश्यक या उपयोगी है?


93

पुराने अजगर संस्करण में जब आप अजगर में एक वर्ग बनाते हैं, तो यह उस वस्तु से प्राप्त हो सकता है जो अब तक मैं एक विशेष अंतर्निहित अजगर तत्व को समझता है जो आपकी वस्तु को एक नई शैली की वस्तु बनाने की अनुमति देता है।

नए संस्करण (> 3.0 और 2.6) के बारे में क्या? मैं वर्ग वस्तु के बारे में गुगली करता हूं, लेकिन मुझे इतना परिणाम मिलता है (स्पष्ट कारणों के लिए)। कोई संकेत?

धन्यवाद!


2
यदि आपका कोड 2.x के तहत भी उपयोग किया जाएगा, तो स्पष्ट होना अच्छा है।
— मुस्कान

1
यह इस सवाल का अच्छी तरह से उत्तर दिया गया है: stackoverflow.com/questions/4015417/…
— nngeek

जवाबों:


92

आपको objectअजगर से नई शैली के लिए विरासत में प्राप्त करने की आवश्यकता नहीं है । 3. सभी वर्ग नई शैली के हैं।


5
ध्यान दें कि इसका मतलब यह है कि सभी वर्गों को objectध्यान (object)में रखते हुए या पाइथन 3.1 में टाइप करने से विरासत में
— मिलती है

8
आपके पास नहीं है, लेकिन "पोर्टिंग पायथन कोड टू पायथन 3" कहता है कि यह अभी भी मान्य है: docs.python.org/py3k/howto/pyporting.html#subclass-object इसके अलावा: docsththon.org/reference/ …
— हाइपरबोरियन

Nngeek की टिप्पणी में उल्लिखित इस पोस्ट से , पुरानी-शैली बनाम नई-शैली (केवल Py2 के लिए वास्तव में प्रासंगिक) के लिए एक अच्छा स्थिर संदर्भ लगता है: docs.python.org/2/reference/… - उपरोक्त लिंक लग रहे थे तब से बदल गया।
— एरिक कजिनो

80

मुझे एहसास है कि यह एक पुराना सवाल है, लेकिन यह ध्यान देने योग्य है कि अजगर 3 में भी ये दोनों चीजें एक समान नहीं हैं।

यदि आप स्पष्ट रूप से विरासत में प्राप्त objectकर रहे हैं, तो आप जो कर रहे हैं वह उस समय के बिंदुओं की परवाह किए बिना विरासत में मिला है builtins.object ।

इसलिए, मेरे पास कुछ (बहुत निराला) मॉड्यूल हो सकता है जो किसी कारण से ऑब्जेक्ट को ओवरराइड करता है। हम इस पहले मॉड्यूल को "newobj.py" कहेंगे:

import builtins

old_object = builtins.object  # otherwise cyclic dependencies

class new_object(old_object):

    def __init__(self, *args, **kwargs):
        super(new_object, self).__init__(*args, **kwargs)
        self.greeting = "Hello World!" 

builtins.object = new_object  #overrides the default object

फिर किसी अन्य फ़ाइल ("klasses.py") में:

class Greeter(object):
    pass

class NonGreeter:
    pass

फिर एक तीसरी फ़ाइल में (जिसे हम वास्तव में चला सकते हैं):

import newobj, klasses  # This order matters!

greeter = klasses.Greeter()
print(greeter.greeting)  # prints the greeting in the new __init__

non_greeter = klasses.NonGreeter()
print(non_greeter.greeting) # throws an attribute error

तो आप देख सकते हैं कि, जिस मामले में यह स्पष्ट रूप से वस्तु से विरासत में मिला है, हम एक अलग व्यवहार प्राप्त करते हैं जहां आप निहित विरासत की अनुमति देते हैं।


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