Sp Metody ekologiczne są sprawdzane na typu (np. klasa) obiektu, na którym operuje się, a nie na konkretnym przykładzie. Pomyśl o tym: w przeciwnym razie, jeśli klasa definiuje na przykład __call__
, gdy klasa nazywa się, że __call__
powinno zostać wywołane ... co za katastrofa! Ale na szczęście specjalna metoda jest zamiast tego spojrzeniem na typ klasy, metaklasa AKA, i wszystko jest w porządku ("klasy spuścizny" miały bardzo nieregularne zachowanie, dlatego wszyscy jesteśmy lepsi od tych w nowym stylu - które są jedynymi pozostawionymi w Pythonie 3).
Więc jeśli potrzebujesz "nadpisywania instancji" metod specjalnych, musisz upewnić się, że instancja ma własną unikalną klasę. To bardzo proste:
class a(object):
def __init__(self):
self.__class__ = type(self.__class__.__name__, (self.__class__,), {})
self.__class__.__call__ = lambda x:x
i jesteś tam. Oczywiście w tym przypadku byłoby to głupie, ponieważ każda instancja kończy się na tej samej "tak zwanej instancji" (!) __call__
, ale przydałaby się sytuacja, gdy naprawdę potrzebowałeś nadpisywania dla poszczególnych instancji .
Próbuję zrobić trochę cukru syntatic. Możesz sobie wyobrazić tworzenie tak dynamicznego generatora funkcji. klasy A: B = create_custom_function ("AA") C = create_custom_function ("BB") – kjshim