पायथन में, मौजूदा बराबर अपरिवर्तनीय वस्तुओं का पुन: उपयोग करना संभव है (जैसे str
के लिए किया जाता है)? क्या यह __hash__
विधि को परिभाषित करके किया जा सकता है, या क्या इसे अधिक जटिल उपायों की आवश्यकता है?अपरिवर्तनीय वस्तुओं के लिए मौजूदा वस्तुओं का पुन: उपयोग करें?
उत्तर
यदि आप कक्षा कन्स्ट्रक्टर के माध्यम से बनाना चाहते हैं और इसे पहले बनाए गए ऑब्जेक्ट को वापस करना चाहते हैं तो आपको __new__
विधि प्रदान करने की आवश्यकता होगी (क्योंकि जब तक आप __init__
पर ऑब्जेक्ट पहले ही बना चुके हैं)।
यहाँ एक सरल उदाहरण है - अगर आरंभ करने के लिए इस्तेमाल मूल्य से पहले तो देखा गया है पूर्व में बने वस्तु बनाया एक नया एक के बजाय लौटा दिया जाता है:
class Cached(object):
"""Simple example of immutable object reuse."""
def __init__(self, i):
self.i = i
def __new__(cls, i, _cache={}):
try:
return _cache[i]
except KeyError:
# you must call __new__ on the base class
x = super(Cached, cls).__new__(cls)
x.__init__(i)
_cache[i] = x
return x
ध्यान दें कि यह उदाहरण के लिए आप कुछ भी उपयोग कर सकते हैं जब तक यह हैशबल है तब तक शुरू करने के लिए। और सिर्फ यह दिखाने के लिए कि वास्तव में वस्तुओं का पुन: उपयोग किया जा रहा है:
>>> a = Cached(100)
>>> b = Cached(200)
>>> c = Cached(100)
>>> a is b
False
>>> a is c
True
धन्यवाद।यह काम करता है, मैंने उपयोग किया जाने वाला एकमात्र अंतर ऐसा था: 'वर्ग ए (ऑब्जेक्ट): _cached = {} <फिर बाकी> '। कारण मैंने ऐसा इसलिए किया क्योंकि मुझे लगता है कि फ़ंक्शन पैरामीटर में तत्काल ऑब्जेक्ट्स भ्रमित हो सकते हैं, क्योंकि कुछ मामलों में लोगों को यह नहीं पता हो सकता है कि इसे केवल एक बार तत्काल किया जा रहा है, और यह उस ऑब्जेक्ट को उस सभी ऑब्जेक्ट्स के लिए संदर्भित करता है समारोह। – Abbafei
@Abafei: हाँ, आपका परिवर्तन एक अच्छा है। बहुत से लोग म्यूटेबल डिफॉल्ट तर्क से बचने के लिए पसंद करते हैं क्योंकि वे अक्सर दूसरों को भ्रमित करते हैं - मैं काफी समझदार नहीं हूं :) –
ध्यान दें कि '__init__' को दो बार * कहा जाएगा * जब कैश मिस हो और एक बार कैश हिट हो । आपको कई कन्स्ट्रक्टर कॉल के खिलाफ स्पष्ट रूप से सुरक्षा करने की आवश्यकता है उदा। '__init__' के अंत में ध्वज सेट करें और ध्वज सेट होने पर तत्काल वापस आएं। – kynan
मेरा मानना है कि आपको पहले से बनाए गए उदाहरणों के एक नियम {args: object} रखना होगा, फिर उस शब्दकोश को चेक करने के लिए '__new__
विधि' को ओवरराइड करना होगा, और प्रासंगिक ऑब्जेक्ट को पहले से मौजूद होने पर वापस कर देना होगा। ध्यान दें कि मैंने इस विचार को लागू या परीक्षण नहीं किया है। बेशक, सी स्तर पर तारों को संभाला जाता है।
हां यह काम करता है - मैंने पहले इस विधि का सफलतापूर्वक उपयोग किया है। अगर कल कोई मुझे मारता है तो मैं कल कुछ उदाहरण कोड पोस्ट कर सकता हूं। –
इस के लिए दो 'सॉफ्टवेयर इंजीनियरिंग' समाधान हैं जिन्हें पायथन के निम्न स्तर के ज्ञान की आवश्यकता नहीं है। वे निम्नलिखित परिदृश्यों में लागू होते हैं:
पहला परिदृश्य: यदि आपकी रचना के पैरामीटर के साथ निर्मित होते हैं तो आपकी कक्षा के ऑब्जेक्ट 'बराबर' होते हैं, और समानता निर्माण के बाद समय के साथ नहीं बदलेगी। समाधान: उपयोग एक कारखाने कि निर्माता मापदंडों hashses:
class MyClass:
def __init__(self, someint, someotherint):
self.a = someint
self.b = someotherint
cachedict = { }
def construct_myobject(someint, someotherint):
if (someint, someotherint) not in cachedict:
cachedict[(someint, someotherint)] = MyClass(someint, someotherint)
return cachedict[(someint, someotherint)]
यह दृष्टिकोण अनिवार्य रूप से अलग इनपुट जोड़ी प्रति एक अद्वितीय वस्तु को अपने वर्ग के उदाहरण सीमित करता है। स्पष्ट दोष भी हैं: सभी प्रकार आसानी से हर्षनीय नहीं हैं और इसी तरह।
दूसरा परिदृश्य: आपकी कक्षा के ऑब्जेक्ट्स उत्परिवर्तनीय हैं और समय के साथ उनकी 'समानता' बदल सकती है। समाधान: बराबर उदाहरणों में से एक वर्ग के स्तर के रजिस्ट्री को परिभाषित:। जबकि तीसरे पैरामीटर शामिल नहीं किए जाते
class MyClass:
registry = { }
def __init__(self, someint, someotherint, third):
MyClass.registry[id(self)] = (someint, someotherint)
self.someint = someint
self.someotherint = someotherint
self.third = third
def __eq__(self, other):
return MyClass.registry[id(self)] == MyClass.registry[id(other)]
def update(self, someint, someotherint):
MyClass.registry[id(self)] = (someint, someotherint)
इस उदाहरण में, एक ही someint, someotherint
जोड़ी के साथ वस्तुओं, बराबर हैं चाल मापदंडों रखना है सिंक में registry
में। update
के विकल्प के रूप में, आप अपनी कक्षा के लिए getattr
और setattr
ओवरराइड कर सकते हैं; इससे यह सुनिश्चित होगा कि foo.someint = y
कोई भी असाइनमेंट आपके क्लास-स्तरीय शब्दकोश के साथ समन्वयित रखा जाएगा। उदाहरण here देखें।
- 1. पूर्ववत करें/अपरिवर्तनीय वस्तुओं
- 2. अपरिवर्तनीय वस्तुओं
- 3. सीरियलाइजिंग और अपरिवर्तनीय वस्तुओं
- 4. संग्रह वस्तुओं का उपयोग करता है() मौजूदा वस्तुओं की जांच के लिए उपयोग करता है?
- 5. मैं अपरिवर्तनीय वस्तुओं के पेड़ का उपयोग कैसे करूं?
- 6. सी #: सूची की वस्तुओं का अपरिवर्तनीय दृश्य?
- 7. क्या javax.xml.ws.Service वस्तुओं का पुन: उपयोग करना सुरक्षित है?
- 8. स्केल अपरिवर्तनीय वस्तुओं और वैल फ़ील्ड के साथ लक्षण
- 9. स्कैला में मौजूदा गणना वस्तुओं का विस्तार कैसे करें?
- 10. वस्तुओं
- 11. अपरिवर्तनीय वस्तुओं को परिवर्तनीय वस्तुओं (रिकर्सिव) में परिवर्तित करने का सबसे अच्छा तरीका क्या है?
- 12. वस्तुओं
- 13. वस्तुओं
- 14. वस्तुओं के लिए कोई फायदा। GetObject (i) वस्तुओं पर [i]?
- 15. आरईएसटी वस्तुओं के लिए अनुबंध उत्पन्न करें
- 16. वस्तुओं
- 17. उपयोग चेक बॉक्स वस्तुओं
- 18. आवरण वस्तुओं का उपयोग करना ठीक एक्सेल इंटरॉप साफ करने के लिए वस्तुओं
- 19. अप्रबंधित वस्तुओं के लिए GC.AddMemoryPressure
- 20. वस्तुओं के लिए मोंगोडीबी संबंध
- 21. संबंधित वस्तुओं के साथ कस्टम मैनेजर का उपयोग कैसे करें?
- 22. वस्तुओं पर अंडरस्कोर के "चौराहे" का उपयोग कैसे करें?
- 23. प्रभावी ढंग से अपरिवर्तनीय वस्तुओं को समझ में आता है?
- 24. GSON का उपयोग कर पार्स और वस्तुओं
- 25. वस्तुओं की तुलना करें?
- 26. संकलित वस्तुओं का लेआउट
- 27. वस्तुओं के लिए लिंक - पहली वस्तु का चयन करें
- 28. क्या जावा अपरिवर्तनीय वस्तुओं को अनुकूलित करता है?
- 29. पैटर्न वस्तुओं
- 30. स्कैला के अपरिवर्तनीय संग्रहों को अपरिवर्तनीय वस्तुओं को कैसे बनाए रखें
+1 दिलचस्प प्रश्न। मुझे तारों के बारे में पता है कि प्रक्रिया को "इंटर्निंग" कहा जाता है लेकिन मुझे यकीन नहीं है कि यह शब्द विशेष रूप से तारों के लिए है, क्योंकि मैंने कभी भी इंटर्निंग करने वाले किसी और चीज के बारे में कभी नहीं सुना है। – Davy8
अक्सर हैश फ़ंक्शन ऑब्जेक्ट के पते के रूप में लागू किया जाएगा, इसलिए आपको चिकन/अंडे की समस्या मिलती है; हैश तब तक बराबर नहीं होगा जब तक कि आप पहले से ही तय नहीं कर लेते हैं कि ऑब्जेक्ट समान हैं। –