Пытаюсь использовать классы-декораторы в базовом классе в Python 3, но не полностью понимаю поведение, которое я наблюдаю.
class tagged:
""" Decorator itself. """
def __init__(self, regClass, *args, **kwargs):
""" called after class definition """
print(self, regClass, regClass.name)
@tagged
class Base(object):
name = "Base class"
#class Derived(Base):
# name = "Derived class"
Первый класс работает как положено, и я вижу
__init__ <__main__.tagged object at 0x100632cc0> <class '__main__.Base'>
Base class
Но когда я раскомментирую Derived
, он не пересылает свои аргументы декоратору, как я ожидал.
_init__ <__main__.tagged object at 0xb74c516c> <class '__main__.Base'>
Base class
__init__ <__main__.tagged object at 0xb74c51cc> Derived
Traceback (most recent call last):
File "./prog.py", line 10, in <module>
File "./prog.py", line 4, in __init__
AttributeError: 'str' object has no attribute 'name'
Моей мотивацией здесь является улучшение моего Pyfu, в частности, я пробую различные способы достижения саморегистрации в подмодулях (в частности, эти модули представляют собой подкоманды, которые регистрируются с помощью индекса подкоманды, а затем предоставляют свои наборы аргументов анализатору тогда и только тогда, когда выбрана конкретная подкоманда).