2009-11-30 12 views
7

स्मॉलटॉक में एक संदेश DoesNotUnderstand है जिसे किसी ऑब्जेक्ट को संदेश समझ में नहीं आता है (यह तब होता है जब ऑब्जेक्ट को संदेश भेजा गया नहीं है)।पायथन - एक फ़ंक्शन मौजूद है जिसे किसी ऑब्जेक्ट को फ़ंक्शन लागू नहीं करते हैं?

तो, मुझे यह जानना अच्छा लगता है कि पाइथन में एक ऐसा कार्य है जो एक ही काम करता है।

इस उदाहरण में:

class MyObject: 
    def __init__(self): 
     print "MyObject created" 

anObject = MyObject() # prints: MyObject created 
anObject.DoSomething() # raise an Exception 

तो, मैं MyObject के लिए एक विधि जोड़ सकते हैं तो मैं पता कर सकते हैं जब DoSomething के नाम से जाना intented है?

पीएस: मेरी खराब अंग्रेजी के लिए खेद है।

उत्तर

7

यहाँ आप क्या करना चाहते हैं के लिए एक प्रस्ताव है:

class callee: 
    def __init__(self, name): 
     self.name = name 

    def __call__(self): 
     print self.name, "has been called" 


class A: 
    def __getattr__(self, attr): 
     return callee(attr) 

a = A() 

a.DoSomething() 
>>> DoSomething has been called 
+0

यह वही है जो मैं चाहता हूं! धन्यवाद :) –

+0

मुझे यह पसंद है जब कोई निश्चित रूप से अपमानजनक है! (या वह "defiantly निश्चित" है?) जो भी हो, तो दिन फिर से बचाता है! :) – PaulMcG

3

आप __getattr__ विधि की तलाश में हैं। here देखें।

यदि आप कक्षा के "कुल नियंत्रण" चाहते हैं, तो __getattribute__ विशेष विधि (here) देखें।

2

मैं क्यों ल्यूक दो अलग-अलग वर्गों के लिए किया था पता नहीं है। यदि आप बंद करने का उपयोग करते हैं, तो आप इसे एक वर्ग के साथ कर सकते हैं। इसलिए जैसा:

class A(object): 
    __ignored_attributes__ = set(["__str__"]) 

    def __getattr__(self, name): 
     if __name__ in self.__ignored_attributes__: 
      return None 

     def fn(): 
      print name, "has been called with self =", self 

     return fn 

a = A() 
a.DoSomething() 

मैं क्योंकि अजगर कक्षा में __str__ ऊपर देख रहा था और उस थोड़ा जटिल हो गया बिट के बारे में __ignored_attributes__ गयी।

+1

दो वर्गों क्योंकि इसे अधिक आसानी से पुन: उपयोग किया जा सकता है। कल्पना करें कि आप कक्षा बी के लिए एक ही व्यवहार चाहते हैं – luc

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