वास्तविक अनंत लूप नहीं है, क्योंकि __call__
विधि उन सभी स्थितियों के लिए वास्तव में नहीं बुलाया जाता है ("कहा जाता है")। यह केवल तब ही लागू होता है जब किसी ऑब्जेक्ट पर फ़ंक्शन-जैसी कॉल होती है जो __call__
विधि प्रदान करती है।
सामान्य वर्ग तत्काल Cls(...)
और नियमित कार्यात्मक आमंत्रण f()
ज्ञात मामले हैं जिन्हें सीधे संभाला जाता है। आम तौर पर __call__()
का एक वास्तविक मंगलाचरण नहीं है, इसलिए __call__
विधि आमंत्रण कि कभी भी हो सकता है, यहां तक कि गहरी विरासत, metaclasses, आदि के साथ जटिल मामलों में एक परिमित संख्या में देखते हैं
क्योंकि वहाँ के रूप में कुछ विवाद था कि क्या वैचारिक अनंत लूप की शॉर्ट-सर्किटिंग वास्तव में हो रही थी, चलो अलग-अलग बाइटकोड देखें। निम्नलिखित कोड पर विचार करें:
def f(x):
return x + 1
class Adder(object):
def something(self, x):
return x + 19
def __call__(self, x):
return x + 1
def lotsacalls(y):
u = f(1)
a = Adder()
z = u + a.something(y)
return a(z * 10)
क्षमा करें यह एक छोटे जटिल है, के रूप में मैं शॉर्ट सर्किट के कई उदाहरण दिखाना चाहते हैं - अर्थात्, सामान्य def
काम करता है, __init__
कॉल, सामान्य तरीके, और __call__
विशेष तरीकों। अब:
तो यहाँ समय की एक श्रेणी है जब, अगर अजगर वास्तव में थे, वास्तव में वैचारिक __call__
आमंत्रण के "पेड़ चलने", यह Function
(और संभवतः Method
कक्षाओं का संदर्भ, और आह्वान करने के लिए किसी की __call__
विधियों)। यह नहीं है यह सभी मामलों में सरल बाइटकोड CALL_FUNCTION
का उपयोग करता है, वैचारिक पेड़-चलने को कम सर्किट करना। तार्किक रूप से आप कल्पना कर सकते हैं कि एक वर्ग Function
है जिसमें __call__
विधि है जो किसी फ़ंक्शन (यानी Function
कक्षा का एक उदाहरण) कहा जाता है। लेकिन यह वास्तव में उस तरह से काम नहीं करता है। कंपाइलर, बाइटकोड दुभाषिया, और सी-भाषा अंडरपिनिंग के अन्य हिस्सों वास्तव में मेटा-क्लास पेड़ चलते नहीं हैं। वे पागल की तरह शॉर्ट-सर्किट।
स्रोत
2015-09-30 00:45:33
आह धन्यवाद! यह सब अब समझ में आता है: डी –