Форум сайта python.su
0
Здравствуйте, уважаемые знатоки Python (Python3)! Помогите пожалуйста разобраться. Я недавно увлекся этим языком (пришел с шарпа) и столкнулся с ситуацией на которой уже сломал моск.
Есть кусочек кода, на первый взгляд ничего сложного, но он не отрабатывает и я не могу понять в чем дело. Суть в том, что я не могу унаследоваться от декорированого класса. Ошибка вываливается еще на этапе импорта файла, т.к. в конструктор декоратора который должен принять объект класса(производный от type) на этом этапе передается 4-е параметра вместо одного законного.
class Decorator:
def __init__(self, cls):
self.cls = cls
def __call__(self, *args, **kwargs):
return self.cls(*args, **kwargs)
@Decorator
class Parent: pass
class Child(Parent): pass
def main():
pass
if __name__ == "__main__":
main()
Офлайн
857
py_beginner__init__ - это не конструктор, а инициализатор (когда он срабатывает, объект уже создан)
т.к. в конструктор декоратора который должен принять объект класса
>>> class Decorator: ... def __init__(self, cls): ... self.cls = cls ... ... def __call__(self, *args, **kwargs): ... return self.cls(*args, **kwargs) ... >>> @Decorator ... class Parent: pass ... >>> Parent <__main__.Decorator object at 0xb73bf06c> >>> Decorator <class '__main__.Decorator'> >>>
Отредактировано py.user.next (Июль 29, 2015 02:31:10)
Офлайн
0
Спасибо. Действительно, я забыл что декораторы это не подобие атрибутов в шарпе или аннотаций в джаве, а синтаксический сахар после применения которого объявление класса превратится в нечто вроде Parent = Decorator(Parent). Этот код - упрощенная версия декоратора который применялся для того чтобы сделать все методы класса потокобезопасными, а унаследовавшись от него планировалось избежать применения декоратора, но как оказалось достигнуть этого можно только либо декорируя наследника, а не предка, либо - реализовать нужный функционал на основе метакласса (в этом случае, по идее, проблем с наследованием возникнуть не должно). Еще раз спасибо!
Офлайн