Je souhaite attribuer dynamiquement une implémentation de fonction.Affectation dynamique de l'implémentation de la fonction en Python
Commençons par les éléments suivants:
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"
Dans d'autres langues nous ferait doItBetter une fonction anonyme et l'affecter à l'objet. Mais pas de support pour les fonctions anonymes en Python. Au lieu de cela, nous allons essayer de faire une instance de classe appelables et assignons à la classe:
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()
Cela me donne ceci:
Traceback (most recent call last): Line 13, in doer.doSomething() Line 9, in call print "%s got it done better" % self.name AttributeError: 'DoItBetter' object has no attribute 'name'
Enfin, j'ai essayé attribuer le appelable à l'instance d'objet comme un attribut et de l'appeler:
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()
Cela ne fonctionne aussi longtemps que je ne fait pas référence à soi dans DoItBetter, mais quand je le fais me donne une erreur de nom self.name
parce qu'il est le référencement le self
du callable, pas la classe propriétaire self
. Donc je cherche un moyen pythonien pour assigner une fonction anonyme à une fonction de classe ou une méthode d'instance, où l'appel de méthode peut référencer self
de l'objet.
Rien de mal avec la toute première approche que vous avez rejetée. Pourquoi le rendez-vous si complexe? –
Votre erreur est vraiment étrange - essayez-vous d'exécuter un script Python avec un interpréteur ruby? (Votre fichier s'appelle 'prog.rb',' .py' est l'extension de fichier Python). L'erreur n'est certainement pas de Python - 'self' n'est pas un mot-clé dans Python. –
Mon erreur - l'a couru sur un codepad en ligne avec les paramètres ruby - fixe – Yarin