python - Specifying an exit function for an abstract function -
मुझे फ़ंक्शन को एक सार विधि से कॉल करने की आवश्यकता है, अर्थात
class A (वस्तु): @ abc.abstractmethod डीईएफ़ Method1 (स्वयं): अपवाद बढ़ा ( "लागू नहीं किया गया विधि") डीईएफ़ Method2 (स्वयं): प्रिंट वर्ग बी (ए) "Method1 समाप्त हो गया": डीईएफ़ Method1 (स्वयं): प्रिंट "से Method1 क्रियान्वित क्लास बी "
मुझे method1
के बाद ए को स्वचालित रूप से कॉल करने की आवश्यकता है I को निष्पादित किया गया है (यह कक्षा <कोड> ए पक्ष पर किया जाना चाहिए - स्वतंत्र रूप से विरासत में मिली कक्षाओं से)।
क्या ऐसा करने का एक अच्छा तरीका है?
आप metaclass का उपयोग कर सकते हैं, जो कक्षा बनाते समय method1
को लपेटता है:
मिक्ट कूल आयात से वर्ग मेटा (प्रकार): डीईएफ़ __ एनयूयू (मेटा, नाम, कुर्सियां, एट्र) आती है: method1 = attr ['method1'] अगर नहीं मिलता है attr (विधि, '__isabstractmethod__'): @wraps (Method1) डीईएफ़ आवरण (स्वयं, * args, ** kw): रेस = Method1 (स्वयं, * args, ** kw) self.method2 () वापसी रेस attr [ ' Method1 '] = आवरण वापसी सुपर (MetaA, मेटा) .__ नई __ (मेटा, नाम, ठिकानों, attr) वर्ग एक (वस्तु): __metaclass__ = MetaA @ abc.abstractmethod डीईएफ़ Method1 (स्वयं): अपवाद बढ़ा ( "लागू नहीं किया गया विधि") Def method2 (स्वयं): प्रिंट "method1 समाप्त"
यह तब लागू होता है जो एक विशिष्ट विधि के लिए मूलतः एक डेकोरेटर होता है, जब भी कोई (उप) वर्ग बनाया जाता है।
एक और दृष्टिकोण, कुछ हद तक हैश, विधि पहुंच को रोकना है, लेकिन काम करेगा आप एक लागू होता __ getAttribute __
पर एक
एक आवरण कहते हैं कि हुक: functools क्लास ए (वस्तु) आयात wraps से
: @abc .abstractmethod डीईएफ़ Method1 (स्वयं): उठाने के अपवाद ( "लागू नहीं किया गया विधि") डीईएफ़ Method2 (स्वयं): प्रिंट "Method1 समाप्त हो गया" डीईएफ़ __getattribute __ (स्वयं, नाम): obj = सुपर (ए, आत्म) .__ getAttribute __ (नाम) यदि नाम == 'Method1': @wraps (obj) डीईएफ़ आवरण (* args, ** kw): रेस = obj () self.method2 () वापसी रेस वापसी आवरण लौट obj
या तो दृष्टिकोण परिणाम:
> gt; & gt; बी ()। विधि 1 () कक्षा बी विधि 1 से विधि 1 को निष्पादित करना
आवरण का उपयोग करके लिपटे हुए विधि से इसके कई महत्वपूर्ण गुणों को रखता है, जैसे कि उसका नाम और डॉसस्ट्रिंग।
< / div>
Comments
Post a Comment