सरल वर्ग है:
वर्ग ए (ऑब्जेक्ट): __COUNTER = 0 def do_something_1 (स्वयं): ... def do_something_2 (स्वयं): ... def do_something_N (स्वयं): ...
क्या कोई निर्णय है जो बढ़ा सकता है < कोड> स्वयं .__ COUNTER विधि बुला कर, लेकिन इसे प्रत्येक फ़ंक्शन पर लिख नहीं सकता?
मुझे कुछ के रूप में चाहिए:
a = A ) # COUNTER = 1 बी = ए () # COUNTER = 2 सी = ए () # COUNTER = 3
विधियों में हुक करने के लिए कहा जाता है कि आपको डेकोरेटर का उपयोग करना होगा:
def increment_counter (विधि): डेफ आवरण (स्वयं, * आर्ग्स, * * केडब्ल्यू): स्वयं। टैग: + 1 वापसी पद्धति (स्वयं, * आर्ग्स, ** केडब्ल्यू) रिटर्न आवरण
और इसे अपनी कक्षा में प्रत्येक विधि के लिए लागू करें:
वर्ग ए (ऑब्जेक्ट): _COUNTER = 0 @increment_counter def do_something_1 (स्वयं): ... @increment_counter def do_something_2 (स्वयं): ... @increment_counter def do_something_N (स्वयं): ...
ध्यान दें कि मैंने एक अंडरस्कोर का उपयोग करने के लिए काउंटर का नाम बदला गड़बड़ नाम।
यदि आप चाहिए के पास
__ COUNTER काम है (इसलिए डबल अंडरस्कोर के साथ), आप कक्षा के नाम से गुजरकर ऐसा कर सकते हैं :
def increment_counter (classname): counter_attribute = '_ {} __ COUNTER.format (classname) def increment_counter_decorator (विधि): def wrapper (स्वयं, * args, ** kw): setattr
फिर से तरीकों को सजाने के लिए: पूर्व>
@increment_counter ('ए') def do_something_1 (स्वयं): ...
यदि आप इसके बजाय एक काउंटर प्रति उदाहरण बनाना चाहते हैं, बस क्लास पर काउंटर में जोड़ें:
वर्ग ए (ऑब्जेक्ट): _COUNTER = 0 def __init __ (स्वयं): ए। एएआईआर + = 1
या
प्रकार का उपयोग करें (से एलएफ) ._ COUNTER यदि आप
ए की एक उप काउंटर प्रति अलग काउंटर का उपयोग करना चाहते हैं।
No comments:
Post a Comment