Кстати, вышеуказанный autosuper работает только для нового типа классов (порожденных от object), для классических не пройдет. А у меня, как назло, код завязан на несколько “классических” классов (пример: cmd.Cmd). Потому (из упрямства) попытался решить проблему, вышло вот так:
# Для старых классов (не порожденных от object) пользуемся так:
# make_super_for_classic_class(MyOld, Old)
# , установить после (!) описания класса MyOld
class Super(object):
''' По примеру http://www.python.org/download/releases/2.2/descrintro/#superexample '''
def __init__(self, typ, obj):
self.typ = typ
self.obj = obj
def __getattr__(self, attr):
dct = self.typ.__dict__
if attr in dct:
x = dct[attr]
if hasattr(x, "__get__"):
# привязка метода x к объекту self.obj
x = x.__get__(self.obj)
return x
raise AttributeError, attr
def make_super_for_classic_class(cls, parent_cls):
def get_super_attr(obj):
return Super(parent_cls, obj)
# добавляем атрибут __super через setattr из-за скрытности первого
# вне класса cls
setattr(cls, "_%s__super" % cls.__name__, property(get_super_attr))
Покритикуйте, пож. . Тестовый пример:
class AClassic:
def func(self):
return "A"
class BClassic(AClassic):
def func(self):
return self.__super.func() + "B"
make_super_for_classic_class(BClassic, AClassic)
class CClassic(BClassic):
def func(self):
return self.__super.func() + "C"
make_super_for_classic_class(CClassic, BClassic)
eq_('ABC', CClassic().func())