Python всегда ищет специальные методы в классе, а не в экземпляре (за исключением старых, так называемых «устаревших», классов) - они устарели и исчезли в Python 3 из-за странной семантики, которая в основном происходит от поиска специальных методов в экземпляре, так что вы действительно не хотите использовать их, поверьте мне! -).
Чтобы создать специальный класс, экземпляры которого могут иметь специальные методы, независимые друг от друга, вам нужно предоставить каждому экземпляру свой собственный класс - тогда вы можете назначить специальные методы для экземпляра (индивидуального) класса без влияя на другие случаи, и жить долго и счастливо Если вы хотите, чтобы это выглядело так, как будто вы присваиваете атрибуту экземпляр, в то время как фактически присваиваете атрибут индивидуализированного класса для каждого экземпляра, вы, конечно, можете получить это с помощью специальной __setattr__
реализации.
Вот простой случай с явным синтаксисом «присвоить классу»:
>>> class Individualist(object):
... def __init__(self):
... self.__class__ = type('GottaBeMe', (self.__class__, object), {})
...
>>> a = Individualist()
>>> b = Individualist()
>>> a.__class__.__int__ = lambda self: 23
>>> b.__class__.__int__ = lambda self: 42
>>> int(a)
23
>>> int(b)
42
>>>
и вот необычная версия, где вы «делаете так, чтобы она выглядела так», вы назначаете специальный метод в качестве атрибута экземпляра (в то время как за кулисами он, конечно, все еще идет в класс):
>>> class Sophisticated(Individualist):
... def __setattr__(self, n, v):
... if n[:2]=='__' and n[-2:]=='__' and n!='__class__':
... setattr(self.__class__, n, v)
... else:
... object.__setattr__(self, n, v)
...
>>> c = Sophisticated()
>>> d = Sophisticated()
>>> c.__int__ = lambda self: 54
>>> d.__int__ = lambda self: 88
>>> int(c)
54
>>> int(d)
88