मैं कक्षा के उदाहरण को वापस करने के लिए कक्षा के __new__()
विधि को पार कर रहा हूं जिसमें विशिष्ट __init__()
सेट है। अजगरउदाहरण के निर्माण पर पायथन कॉल इंस्टेंस विधि __init __() क्यों नहीं है बल्कि क्लास-प्रदान किए गए __init __() को कॉल करता है?
http://docs.python.org/reference/datamodel.html
में, उदाहरण के विशेष विधि के बजाय वर्ग-प्रदान की __init__()
विधि कॉल करने हालांकि अजगर प्रलेखन लगता है कहते हैं:
विशिष्ट कार्यान्वयन से वर्ग का एक नया उदाहरण बनाने सुपर (वर्तमान क्लास, सीएलएस) का उपयोग कर सुपरक्लास की __new __() विधि का उपयोग करना .__ नया __ (सीएलएस [, ...]) उचित तर्क के साथ और फिर इसे बनाए जाने से पहले के रूप में नव निर्मित उदाहरण को संशोधित करना।
__new __() cls का एक उदाहरण देता है, तो उसके बाद नया उदाहरण के __init __() विधि __init __ तरह सक्रिय किया जाएगा (स्वयं [...]), जहां स्वयं नया उदाहरण है और शेष तर्क हैं जैसा कि __new __() को पास किया गया था।
यहाँ अपने परीक्षण कोड है:
#!/usr/bin/env python
import new
def myinit(self, *args, **kwargs):
print "myinit called, args = %s, kwargs = %s" % (args, kwargs)
class myclass(object):
def __new__(cls, *args, **kwargs):
ret = object.__new__(cls)
ret.__init__ = new.instancemethod(myinit, ret, cls)
return ret
def __init__(self, *args, **kwargs):
print "myclass.__init__ called, self.__init__ is %s" % self.__init__
self.__init__(*args, **kwargs)
a = myclass()
जो
$ python --version
Python 2.6.6
$ ./mytest.py
myclass.__init__ called, self.__init__ is <bound method myclass.myinit of <__main__.myclass object at 0x7fa72155c790>>
myinit called, args =(), kwargs = {}
आउटपुट यह myinit()
चलाने के लिए प्राप्त करने के लिए एक ही रास्ता लगता है self.__init__()
myclass.__init__()
अंदर के रूप में स्पष्ट रूप से इसे कॉल करने के लिए है।
महान प्रश्न: यह व्यवहार कारण है कि निम्नलिखित कोड (पुरानी शैली वर्गों के साथ बराबर उदाहरण के विपरीत) एक अपवाद को जन्म देती है! – Marcin