में अनंत लूप से परहेज करना अनंत लूप से बचने के लिए विधि __getattribute__
को ध्यान से लिखा जाना चाहिए। उदाहरण के लिए:पायथन: __getattribute__
class A:
def __init__(self):
self.x = 100
def __getattribute__(self, x):
return self.x
>>> a = A()
>>> a.x # infinite looop
RuntimeError: maximum recursion depth exceeded while calling a Python object
class B:
def __init__(self):
self.x = 100
def __getattribute__(self, x):
return self.__dict__[x]
>>> b = B()
>>> b.x # infinite looop
RuntimeError: maximum recursion depth exceeded while calling a Python object
इसलिए हम इस तरह से विधि लिखने के लिए की जरूरत है:
class C:
def __init__(self):
self.x = 100
def __getattribute__(self, x):
# 1. error
# AttributeError: type object 'object' has no attribute '__getattr__'
# return object.__getattr__(self, x)
# 2. works
return object.__getattribute__(self, x)
# 3. works too
# return super().__getattribute__(x)
मेरा प्रश्न क्यों object.__getattribute__
विधि काम करता है? object
से __getattribute__
विधि प्राप्त होती है? और यदि object
में कोई __getattribute__
नहीं है, तो हम कक्षा C
पर एक ही विधि को कॉल कर रहे हैं लेकिन सुपर क्लास के माध्यम से। फिर, सुपर क्लास के माध्यम से विधि को कॉल करने के परिणामस्वरूप अनंत लूप नहीं होता है?
क्या आप वाकई '__getattribute__' की आवश्यकता है और '__getattr__' नहीं चाहते हैं? –
हां, मैं हूं, क्योंकि मुझे अपनी कक्षा में सभी विशेषताएं लाने की आवश्यकता है। लेकिन अगर मैं नहीं करता, तब भी मैं पूरी जानकारी जानना चाहता हूं कि ऐसा क्यों है। – treecoder
ठीक है, या तो आपको * सभी * विशेषता पहुंच को अवरुद्ध करना होगा या आप नहीं :-) –