Python - существует функция, которая вызывается, когда объект не реализует функцию? - PullRequest
7 голосов
/ 30 ноября 2009

В Smalltalk есть сообщение DoesNotUnderstand, которое вызывается, когда объект не понимает сообщение (это когда объект не имеет реализованного отправленного сообщения).

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

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

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 30 ноября 2009

Вот предложение для того, что вы хотите сделать:

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
3 голосов
/ 30 ноября 2009

Вы смотрели на объект. __getattr__(self, name) или объект. __getattribute__(self, name) для классов нового стиля? (см. Имена специальных методов, справочник по языку Python )

3 голосов
/ 30 ноября 2009

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

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

2 голосов
/ 02 декабря 2009

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

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__ в классе, и это немного запуталось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...