2014-09-25 3 views
5

मैं तरीकों में से एक समूह के साथ एक वर्ग है कहते हैं:पायथन: कक्षा के किसी भी तरीके के लिए कुछ करें?

class Human(): 

    def eat(): 
    print("eating") 

    def sleep(): 
    print("sleeping") 

    def throne(): 
    print("on the throne") 

तो मैं साथ

John=Human() 
John.eat() 
John.sleep() 
John.throne() 

मैं प्रत्येक विधि बुलाया जा रहा है के लिए print("I am") चलाना चाहते हैं सभी तरीकों को चलाते हैं। इसलिए मुझे कुछ

I am: 
eating 
I am: 
sleeping 
I am: 
on the throne 

क्या प्रत्येक विधि को दोबारा सुधारने के बिना ऐसा करने का कोई तरीका है?

+7

को metaprogramming का उपयोग कर वर्ग तरीकों से खुद को बदलने के लिए एक पूर्व/पोस्ट आपरेशन चलाने के लिए, इस सवाल का जवाब की तरह एक डेकोरेटर का उपयोग करें कोशिश कर सकते हैं विधियों: [कक्षा के भीतर सभी कार्यों के लिए एक सजावट संलग्न करना] (http://stackoverflow.com/q/3467526) और [एक वर्ग सजावट लिखना जो सभी विधियों के लिए एक सजावटी लागू करता है] (http://stackoverflow.com/q/6695854) –

+0

यदि आप उन संपादनों की संख्या को कम करने की कोशिश कर रहे हैं जिन्हें आपको बनाना है, तो सबसे सरल बात यह है कि प्रत्येक विधि की परिभाषा को बदलना है। यदि आप किसी भी स्थान पर परिवर्तन को अलग करने का कोई तरीका ढूंढ रहे हैं, तो किसी मौजूदा या भविष्य की विधि पर लागू होने के लिए, सजावटी जाने का रास्ता हैं। – chepner

+0

क्यों कोई फ़ंक्शन 'def do (self, action)' नहीं है, फिर 'खाने' सिर्फ 'self.do ("खाने") बन जाता है और आउटपुट में कोई और परिवर्तन एक ही स्थान पर होता है। – jonrsharpe

उत्तर

5

के लिए मेरे दूसरे जवाब देखने के आप बदल नहीं सकते हैं कि कैसे आप अपने तरीकों कॉल आप __getattribute__ जादू विधि का उपयोग कर सकते हैं (तरीकों गुण भी याद कर रहे हैं!) हर बार जब आप किसी भी डंक का उपयोग करना चाहते हैं या पूर्णांक गुण आप हो सकता है:

import types 

class Human(object): 
    def __getattribute__(self, attr): 
     method = object.__getattribute__(self, attr) 
     if not method: 
      raise Exception("Method %s not implemented" % attr) 
     if type(method) == types.MethodType: 
      print "I am:" 
     return method 

    def eat(self): 
     print "eating" 

    def sleep(self): 
     print "sleeping" 

    def throne(self): 
     print "on the throne" 

John = Human() 
John.eat() 
John.sleep() 
John.throne() 

आउटपुट:

012: बस इतनी आप प्रिंट नहीं है "मैं हूँ" गुण के प्रकार की जाँच करने में सावधान रहना होगा
I am: 
eating 
I am: 
sleeping 
I am: 
on the throne 
-3

आप def iam() जैसी अन्य विधि लिख सकते हैं और विधि print "i am \n" में कोड लिख सकते हैं और प्रत्येक विधि से पहले कॉल कर सकते हैं।

2

यदि आप __init__ और __call__ अपनी कक्षा के लिए विधि और self को अपनी विधि के तर्कों में जोड़ने में कोई फर्क नहीं पड़ता है तो आप ऐसा कर सकते हैं।

class Human(): 
    def __init__(self): 
     return None 
    def __call__(self, act): 
     print "I am:" 
     method = getattr(self, act) 
     if not method: 
      raise Exception("Method %s not implemented" % method_name) 
     method() 

    def eat(self): 
     print "eating" 

    def sleep(self): 
     print "sleeping" 

    def throne(self): 
     print "on the throne" 

John = Human() 
John("eat") 
John("sleep") 
John("throne") 

संपादित: एक बेहतर समाधान

+0

धन्यवाद लेकिन यह समाधान सिंटैक्स को बदलता है कि मैं विधियों को कैसे कॉल करता हूं .. – Pithikos

+0

@Pithikos एक समाधान के लिए मेरा दूसरा उत्तर देखता है जिसके लिए आपको अपनी विधियों को कॉल करने की आवश्यकता नहीं होती है – nettux443

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