A декоратор класса , особенно в Python 2.6 и более поздних версиях, является самым удобным способом обернуть множество методов, чтобы «вернуть экземпляр типа этого класса, а не экземпляр суперкласса», который, как указывалось другими, является ли ваша основная проблема (за исключением споров с __str__
против __repr__
, стоящей, но вовсе не решающей вашу проблему; -).
def returnthisclassfrom(specials):
specialnames = ['__%s__' % s for s in specials.split()]
def wrapit(cls, method):
return lambda *a: cls(method(*a))
def dowrap(cls):
for n in specialnames:
method = getattr(cls, n)
setattr(cls, n, wrapit(cls, method))
return cls
return dowrap
@returnthisclassfrom('and or xor')
class Hex(int):
def __repr__(self): return hex(self)
__str__ = __repr__
a = Hex(2345)
b = Hex(5432)
print a, b, a^b
В Python 2.6 это выдает
0x929 0x1538 0x1c11
по желанию. Конечно, вы можете добавить больше имен методов в декоратор и т.д .; если вы застряли в Python 2.5, удалите декоративную строку (начинающуюся с @
) и используйте вместо нее
class Hex(int):
def __repr__(self): return hex(self)
__str__ = __repr__
Hex = returnthisclassfrom('and or xor')(Hex)
немного менее элегантный, но столь же эффективный; -)
Редактировать : исправлено появление в коде «обычной проблемы с областями видимости».