रोब का जवाब (ऊपर दिया गया वोट) सही है। मैं जोड़ना चाहूंगा कि कुछ स्थितियों में आईडी का उपयोग करना उपयोगी है क्योंकि यह वस्तुओं की तुलना करने और उन वस्तुओं को खोजने की अनुमति देता है जो आपकी वस्तुओं को संदर्भित करती हैं।
बाद में आम तौर पर आप उदाहरण के लिए अजीब बग को डीबग करने में मदद करते हैं जहां उत्परिवर्तित वस्तुओं को कक्षाओं को कहने के लिए पैरामीटर के रूप में पारित किया जाता है और एक कक्षा में स्थानीय संस्करणों को सौंपा जाता है। उन ऑब्जेक्ट्स को म्यूट करना एक वर्ग में vars को म्यूट करेगा। यह खुद को अजीब व्यवहार में प्रकट करता है जहां एक ही समय में कई चीजें बदल जाती हैं।
हाल ही में मुझे एक पायथन / टिंकर ऐप के साथ यह समस्या हुई थी जहाँ एक पाठ प्रविष्टि क्षेत्र में संपादन पाठ ने पाठ को दूसरे में बदल दिया जैसे कि आप टाइप करते हैं :)
यहां एक उदाहरण है कि आप फ़ंक्शन आईडी () का उपयोग कैसे कर सकते हैं ताकि यह पता लगाया जा सके कि वे संदर्भ कहां हैं। हर तरह से यह सभी संभावित मामलों को कवर करने वाला समाधान नहीं है, लेकिन आपको यह विचार प्राप्त है। फिर से आईडी पृष्ठभूमि में उपयोग की जाती है और उपयोगकर्ता उन्हें नहीं देखता है:
class democlass:
classvar = 24
def __init__(self, var):
self.instancevar1 = var
self.instancevar2 = 42
def whoreferencesmylocalvars(self, fromwhere):
return {__l__: {__g__
for __g__ in fromwhere
if not callable(__g__) and id(eval(__g__)) == id(getattr(self,__l__))
}
for __l__ in dir(self)
if not callable(getattr(self, __l__)) and __l__[-1] != '_'
}
def whoreferencesthisclassinstance(self, fromwhere):
return {__g__
for __g__ in fromwhere
if not callable(__g__) and id(eval(__g__)) == id(self)
}
a = [1,2,3,4]
b = a
c = b
democlassinstance = democlass(a)
d = democlassinstance
e = d
f = democlassinstance.classvar
g = democlassinstance.instancevar2
print( 'My class instance is of', type(democlassinstance), 'type.')
print( 'My instance vars are referenced by:', democlassinstance.whoreferencesmylocalvars(globals()) )
print( 'My class instance is referenced by:', democlassinstance.whoreferencesthisclassinstance(globals()) )
उत्पादन:
My class instance is of <class '__main__.democlass'> type.
My instance vars are referenced by: {'instancevar2': {'g'}, 'classvar': {'f'}, 'instancevar1': {'a', 'c', 'b'}}
My class instance is referenced by: {'e', 'd', 'democlassinstance'}
वेरिएबल नामों में अंडरस्कोर का उपयोग नाम कॉलिशन को रोकने के लिए किया जाता है। फ़ंक्शंस "Fromwhere" तर्क का उपयोग करते हैं ताकि आप उन्हें बता सकें कि संदर्भों की खोज कहाँ से शुरू करें। यह तर्क एक फ़ंक्शन द्वारा भरा गया है जो किसी दिए गए नाम स्थान में सभी नामों को सूचीबद्ध करता है। ग्लोबल्स () ऐसा ही एक फंक्शन है।