Sp Los métodos sociales se buscan en el tipo tipo (por ejemplo, clase) del objeto que se está operando, no en la instancia específica. Piénselo: de lo contrario, si una clase define __call__
por ejemplo, cuando se llama a la clase, se debe llamar al __call__
... ¡qué desastre! Pero, afortunadamente, el método especial se busca en el tipo de clase, metaclase AKA, y todo está bien (las "clases heredadas" tenían un comportamiento muy irregular en esto, y es por eso que todos estamos mejor con los nuevos - que son los únicos que quedan en Python 3).
Por lo tanto, si necesita "anulación por instancia" de métodos especiales, debe asegurarse de que la instancia tenga su propia clase única. Eso es muy fácil:
class a(object):
def __init__(self):
self.__class__ = type(self.__class__.__name__, (self.__class__,), {})
self.__class__.__call__ = lambda x:x
y tú estás allí. Por supuesto que sería una tontería en este caso, ya que cada instancia termina con el mismo "llamado por instancia" (!) __call__
, pero sería útil si realmente necesita reemplazar por instancia de cada instancia individual .
que estoy tratando de hacer un poco de azúcar sintáctico. Puedes imaginar hacer un generador de funciones dinámicas como este. clase A: b = create_custom_function ("AA") c = crear_función_personalizada ("BB") – kjshim