Динамическое назначение реализации функции в Python

Я хочу динамически назначить реализацию функции.

Начнем со следующего:

class Doer(object):

    def __init__(self):
        self.name = "Bob"

    def doSomething(self):
        print "%s got it done" % self.name

def doItBetter(self):
    print "Done better"

В других языках мы бы сделали doItBetter анонимной функцией и присвоили бы ее объекту. Но нет поддержки анонимных функций в Python. Вместо этого мы попробуем создать вызываемый экземпляр класса и назначить его классу:

class Doer(object):

    def __init__(self):
        self.name = "Bob"

class DoItBetter(object):

    def __call__(self):
        print "%s got it done better" % self.name

Doer.doSomething = DoItBetter()
doer = Doer()
doer.doSomething()

Это дает мне это:

Traceback (последний последний вызов ):Строка 13, в doer.doSomething ()Строка 9, в вызов print «%s сделал это лучше» % self.name AttributeError :Объект «DoItBetter» не имеет атрибута «имя»

Наконец, я попытался назначить вызываемый объект экземпляру объекта в качестве атрибута и вызвать его:

class Doer(object):

    def __init__(self):
        self.name = "Bob"

class DoItBetter(object):

    def __call__(self):
        print "%s got it done better" % self.name


doer = Doer()
doer.doSomething = DoItBetter()
doer.doSomething()

Это ДЕЙСТВИТЕЛЬНО работает, пока я не ссылаюсь на себя в DoItBetter, но когда я это делаю, это дает мне ошибку имени в self.name, потому что он ссылается на вызываемый объект self, а не на класс-владелец self.

Итак, я ищу питонический способ назначить анонимную функцию функции класса или методу экземпляра, где вызов метода может ссылаться на selfобъекта.

13
задан Yarin 29 April 2012 в 18:16
поделиться