Sp i metodi ecial sono cercati su tipo (ad esempio, classe) dell'oggetto su cui si sta operando, non sull'istanza specifica. Pensaci: altrimenti, se una classe definisce __call__
ad esempio, quando viene chiamata la classe, dovrebbe chiamarsi __call__
... che disastro! Ma fortunatamente il metodo speciale è invece cercato sul tipo della classe, il metaclasse AKA, e tutto va bene ("le classi legacy" avevano un comportamento molto irregolare in questo, ed è per questo che stiamo tutti meglio con quelli di nuova generazione - quali sono gli unici rimasti in Python 3).
Quindi, se è necessario "sovrascrivere per istanza" di metodi speciali, è necessario assicurarsi che l'istanza abbia una propria classe univoca. È molto semplice:
class a(object):
def __init__(self):
self.__class__ = type(self.__class__.__name__, (self.__class__,), {})
self.__class__.__call__ = lambda x:x
e tu sei lì. Ovviamente in questo caso sarebbe sciocco, dato che ogni istanza finisce con la stessa "cosiddetta peristanza" (!) __call__
, ma sarebbe utile se fosse davvero necessario eseguire l'override su base di istanza individuale .
fonte
2009-11-10 06:15:20
Sto cercando di fare un po 'di zucchero syntatic. Puoi immaginare di creare un generatore di funzioni dinamiche come questo. classe A: b = create_custom_function ("AA") c = create_custom_function ("BB") – kjshim