Могу ли я создать объект, который получает вызов произвольного метода в python?

В python могу ли я создать класс, который при создании экземпляра может получать вызов произвольного метода? Я прочитал это, но не смог собрать кусочки вместе

Я думаю, это как-то связано с attribute lookup. Для класса Foo:

class Foo(object):
  def bar(self, a):
    print a

Атрибут класса можно получить с помощью print Foo.__dict__, что дает

{'__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__module__': '__main__', 'bar': <function bar at 0x7facd91dac80>, '__doc__': None}

Так что этот код действителен

foo = Foo()
foo.bar("xxx")

Если я вызову foo.someRandomMethod(), будет получено AttributeError: 'Foo' object has no attribute 'someRandomMethod'.

Я хочу, чтобы объект foo получал любые случайные вызовы и по умолчанию не работал, т.е.

def func():
    pass

Как я могу этого добиться? Я хочу, чтобы это поведение издевалось над объектом для тестирования.


person user2829759    schedule 02.07.2015    source источник
comment
Если вы хотите имитировать объект, почему бы вам не использовать библиотеку Mock, которая делает именно это?   -  person Daniel Roseman    schedule 02.07.2015
comment
@DanielRoseman Ваше предложение совершенно правильное, я просто хочу больше узнать о внутренней работе python.   -  person user2829759    schedule 02.07.2015


Ответы (1)


Из http://rosettacode.org/wiki/Respond_to_an_unknown_method_call#Python

class Example(object):
    def foo(self):
        print("this is foo")
    def bar(self):
        print("this is bar")
    def __getattr__(self, name):
        def method(*args):
            print("tried to handle unknown method " + name)
            if args:
                print("it had arguments: " + str(args))
        return method

example = Example()

example.foo()        # prints “this is foo”
example.bar()        # prints “this is bar”
example.grill()      # prints “tried to handle unknown method grill”
example.ding("dong") # prints “tried to handle unknown method ding”
                     # prints “it had arguments: ('dong',)”
person Nebu Pookins    schedule 02.07.2015
comment
Вот что я ищу! :) - person user2829759; 02.07.2015
comment
method подпись должна принимать *args, **kwargs в качестве аргумента. - person Łukasz Rogalski; 02.07.2015