2009-11-30 3 views
7

В Smalltalk появляется сообщение DoesNotUnderstand, которое вызывается, когда объект не понимает сообщение (это значит, что объект не имеет отправленного сообщения).Python - существует функция, которая вызывается, когда объект не реализует функцию?

Итак, мне нравится знать, есть ли в python функция, которая делает то же самое.

В этом примере:

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

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

Таким образом, я могу добавить метод MyObject так что я могу знать, когда DoSomething будет intented называться?

PS: Извините за мой плохой английский.

ответ

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

Мне нравится, когда кто-то определенно дерзкий! (или это «вызывающе определенно»?) Что бы ни случилось, SO спасает день снова! :) – PaulMcG

3

Вы ищете метод __getattr__. Посмотрите here.

Если вы хотите «полный контроль» класса, посмотрите на специальный метод __getattribute__ (here).

2

Я не знаю, почему Luc имел два отдельных класса. Вы можете сделать все это с одним классом, если вы используете закрытие. Как так:

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() 

Я добавил немного о __ignored_attributes__ потому, что Python смотрела __str__ в классе и получил немного грязный.

+1

два класса, потому что его можно использовать повторно. Представьте, что вы хотите, чтобы такое же поведение для класса B – luc

Смежные вопросы