2010-06-08 8 views
6

मैं अपनी पायथन क्लास को ऐसे तरीके से व्यवहार करना चाहता हूं कि जब किसी भी क्लास विधि को डिफ़ॉल्ट विधि कहा जाता है तो इसे पहले क्लास में स्पष्ट रूप से निर्दिष्ट किए बिना निष्पादित किया जाता है। एक उदाहरण की मदद कर सकते :)निष्पादन से पहले प्रत्येक कक्षा विधि को निर्दिष्ट विधि कैसे कॉल करें?

Class animals: 
    def _internalMethod(): 
     self.respires = True 

    def cat(): 
     self._internalMethod() 
     self.name = 'cat' 

    def dog(): 
     self._internalMethod() 
     self.name = 'dog' 

मैं _internalMethod() स्वचालित रूप से कहा जा करना चाहते हैं जब किसी भी विधि जानवरों का एक उदाहरण से कहा जाता है, बल्कि प्रत्येक विधि के डीईएफ़ में स्पष्ट रूप से यह बताते हुए की तुलना में। क्या ऐसा करने का कोई शानदार तरीका है?

चीयर्स,

उत्तर

5

आप एक metaclass और getattribute का उपयोग गतिशील रूप से सभी तरीकों को सजाने के लिए कर सकता है (यदि आप अजगर 2 का उपयोग कर रहे हैं, object से उपवर्ग के लिए सुनिश्चित हो!)।

एक अन्य विकल्प, वर्ग पर एक Fixup के लिए बस है की तरह:

def add_method_call(func, method_name): 
    def replacement(self, *args, **kw): 
     getattr(self, method_name)() 
     return func(self, *args, **kw) 
    return replacement 

def change_all_attrs(cls, added_method): 
    for method_name in dir(cls): 
     attr = getattr(cls, method_name) 
     if callable(attr): 
      setattr(cls, method_name, add_method_call(attr, added_method)) 

class animals(object): 
    ... 

change_all_attrs(animals, '_internalMethod') 

इस तरह की लापरवाही है, dir() सुपर-क्लास में किसी भी तरीकों नहीं मिलेगा, और आप गुण और अन्य आप वस्तुओं आ सकता है सरल callable(attr) परीक्षण के कारण इरादा नहीं है। लेकिन यह आपके लिए ठीक काम कर सकता है।

अगर पायथन का उपयोग कर 2.7+ आप के बजाय वर्ग बनाने के बाद change_all_attrs बुला के एक वर्ग डेकोरेटर का उपयोग कर सकते हैं, लेकिन प्रभाव ही है (सिवाय आप change_all_attrs के पुनर्लेखन के लिए यह एक डेकोरेटर बनाने के लिए होगा)।

संबंधित मुद्दे