def after_finish(func):

    def _decorator(*args, **kwargs):
        ret = func(*args, **kwargs)
        print('after finish!')
        return ret

    return _decorator

class AbstractTask:
    @after_finish
    def run(self):
        raise NotImplementedError

class ConcreteTask1(AbstractTask):
    def run(self):
        # do concrete task here
        return 0

जैसा कि ऊपर दिखाया गया कोड है, मेरे पास एक सार AbstractTask प्रकार है, और कई बाल वर्ग हैं, मैं after_finish डेकोरेटर को run विधि में रखना चाहता हूं, जो एक सामान्य व्यवहार है जो लागू होता है सभी उपवर्गों को। डेकोरेटर को केवल एक बार लगाकर मैं इस उद्देश्य को कैसे प्राप्त कर सकता हूं? या क्या कोई अन्य दृष्टिकोण है जो वही काम करता है, python3 वाक्यविन्यास के भीतर?

0
Ziqi Liu 9 नवम्बर 2020, 21:52

1 उत्तर

सबसे बढ़िया उत्तर

आप पाने के लिए दूसरी विधि का उपयोग कर सकते हैं

  • वह सार्वजनिक जिसे आप कहते हैं : run
  • निजी जिसे आप ओवरराइड करते हैं: _run

यदि आप विधि को लागू करना भूल गए हैं तो abstractmethod का उपयोग आपके IDE को आपको चेतावनी देने में मदद कर सकता है

from abc import abstractmethod

def after_finish(func):
    def _decorator(*args, **kwargs):
        ret = func(*args, **kwargs)
        print('after finish!')
        return ret
    return _decorator

class AbstractTask:
    @after_finish
    def run(self):
        self._run()

    @abstractmethod
    def _run(self):
        raise NotImplementedError

class ConcreteTask1(AbstractTask):
    def _run(self):
        return 0

if __name__ == '__main__':
    c = ConcreteTask1()
    c.run()
2
azro 9 नवम्बर 2020, 18:57