Je souhaite créer un décorateur de propriété qui calcule la valeur de la propriété une fois lors de l'initialisation de l'objet, plutôt qu'à chaque fois que la propriété est accédée. Par exemple:Est-il possible de patcher le code sur __init__ depuis un décorateur de méthode?
class Foo:
def __init__(self, value):
self.value = value
@cached_property # How to implement this decorator?
def foo(self):
return self.value * some_heavy_computation()
Je voudrais que cela soit équivalent à:
class Foo:
def __init__(self, value):
self.value = value
self._foo = self.value * some_heavy_computation()
@property
def foo(self):
return self._foo
Est-il possible d'ajouter en quelque sorte le code à __init__()
à l'intérieur du décorateur méthode?
Au moment où un décorateur de méthode est évaluée, la classe elle-même ne existe encore, donc vous ne pouvez pas rechercher sa méthode '' __init__'' pour la modifier, même si elle a déjà été définie (ce qui n'est pas quelque chose sur lequel vous pouvez compter). Cependant, vous pouvez écrire un décorateur qui n'appelle la fonction enveloppée que la première fois, enregistre la valeur dans une variable d'instance et renvoie ensuite simplement la valeur mise en cache. – jasonharper
Pourquoi pensez-vous que vous devez ajouter du code à '__init__'? Vous devriez lire le [protocole descripteur] (https://docs.python.org/3/howto/descriptor.html). – jonrsharpe
@ jasonharper Impossible d'obtenir '__init__' du même' cls' et de le remplacer par un '__init__' patché? Disons que je suppose que '__init__' est toujours défini avant les autres méthodes. – danijar