Специальные методы ищутся для типа (например, класса) объекта, с которым выполняется операция, а не для конкретного экземпляра. Подумайте об этом: в противном случае, если класс определяет, например, __call__
, когда класс вызывается, то __call__
должен вызываться ... какая катастрофа! Но, к счастью, специальный метод вместо этого ищется по типу класса, метаклассу AKA, и все хорошо («унаследованные классы» вели себя нерегулярно, поэтому нам всем лучше с новыми стилями - которые остались только в Python 3).
Так что, если вам нужно "переопределение для каждого экземпляра" специальных методов, вы должны убедиться, что экземпляр имеет свой собственный уникальный класс. Это очень просто:
class a(object):
def __init__(self):
self.__class__ = type(self.__class__.__name__, (self.__class__,), {})
self.__class__.__call__ = lambda x:x
и ты там. Конечно, это было бы глупо в этом случае, так как каждый экземпляр заканчивается одинаковыми «так называемыми для каждого экземпляра» (!) __call__
, но было бы полезно, если бы вам действительно нужно было переопределить индивидуальное основа экземпляра.