Я хочу динамически назначить реализацию функции.
Начнем со следующего:
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
объекта.