मैं एक ऐसा फ़ंक्शन बनाने का प्रयास कर रहा हूं जो इसे कॉल किए जाने वाले समय की गिनती रखता है, और मैं चाहता हूं कि जानकारी फ़ंक्शन के अंदर ही रहें। मैं बहुत की तरह एक आवरण बनाने की कोशिश की:अपने शरीर के अंदर एक फ़ंक्शन की विशेषता बदलें?
def keep_count(f):
f.count = 0
@functools.wraps(f)
def wrapped_f(*args, **kwargs):
f(*args, **kwargs)
f.count += 1
return wrapped_f
@keep_count
def test_f(*args, **kwargs):
print(args, kwargs)
मैंने सोचा था कि यह काम करते हैं, लेकिन मैं एक AttributeError
'function' object has no attribute 'count'
कह मिला है।
मैं पहले से ही समस्या लगा: यह क्योंकि डेकोरेटर सेट है मेरी test_f
wrapped_f
(keep_count
डेकोरेटर के अंदर परिभाषित) को बराबर करने के लिए, और मैं मूल f
की गिनती, जो अब के बाद से test_f
संदर्भित करता है प्रयोग किया जाता है में वृद्धि कर रहा हूँ नए समारोह में।
क्या हैकिंग के बिना ऐसा करने का कोई तरीका है?
कक्षा का उपयोग क्यों नहीं करें? इस तरह की एक वर्ग है - –
@AdamSmith में कार्यों को चलाने के लिए एक राज्यव्यापी संदर्भ बनाना, चूंकि अजगर कार्य वस्तुएं हैं, क्या वे राज्य को भी बनाए रख सकते हैं? – wegry
@wegry यकीन है कि वे कर सकते हैं। आप दो बोर्डों को एक साथ नाखून करने के लिए प्लेयर्स की एक जोड़ी का भी उपयोग कर सकते हैं :) –