मैं एक पायथन संपत्ति बनाने की कोशिश कर रहा हूं जहां मूल्य को पुनः प्राप्त करने के अलावा, अलग-अलग विधि द्वारा इन-प्लेस जोड़ने को संभाला जा रहा है, एक और मूल्य जोड़ना और पुन: असाइन करना। तो, एक वस्तु o
पर एक संपत्ति x
, के लिएएक पायथन संपत्ति के लिए __iadd__ को कार्यान्वित करने के लिए कैसे करें
o.x += 5
से
o.x = o.x + 5
अलग तरह से काम करना चाहिए o.x
का मूल्य, अंत में एक ही होना चाहिए, ताकि लोगों की उम्मीदों भ्रमित करने के लिए नहीं है, लेकिन मैं इन-जगह को और अधिक कुशल बनाना चाहता हूं। (वास्तविकता में आपरेशन सरल इसके अलावा तुलना में बहुत अधिक समय लगता है।)
मेरा पहला विचार कक्षा में परिभाषित करने के लिए, था,
x = property(etc. etc.)
x.__iadd__ = my_iadd
लेकिन यह क्योंकि property
लागू करता __slots__
एक AttributeError, शायद जन्म देती है?
class IAddProp(object):
def __init__(self):
self._val = 5
def __get__(self, obj, type=None):
return self._val
def __set__(self, obj, value):
self._val = value
def __iadd__(self, value):
print '__iadd__!'
self._val += value
return self
class TestObj(object):
x = IAddProp()
#x.__iadd__ = IAddProp.__iadd__ # doesn't help
>>> o = TestObj()
>>> print o.x
5
>>> o.x = 10
>>> print o.x
10
>>> o.x += 5 # '__iadd__!' not printed
>>> print o.x
15
आप देख सकते हैं, विशेष __iadd__
विधि नहीं बुलाया जाता है:
मेरा अगला प्रयास की जानकारी देता वस्तु का उपयोग करता है। मुझे यह समझने में परेशानी हो रही है कि यह क्यों है, हालांकि मैं अनुमान लगाता हूं कि ऑब्जेक्ट का __getattr__
किसी भी तरह से इसे बाईपास कर रहा है।
मैं यह कैसे कर सकता हूं? क्या मुझे वर्णनकर्ताओं का मुद्दा नहीं मिल रहा है? क्या मुझे मेटाक्लास चाहिए?
मैं इस कोड स्निपेट द्वारा थोड़ा उलझन में हूं। संपत्ति प्राप्तकर्ता कुछ वापस नहीं करना चाहिए? – senderle
@sendle ओह हाँ, ओह। 'Int' subclassing की समस्याओं के साथ थोड़ा उलझन में मिला। धन्यवाद! – ecatmur