【发布时间】:2014-12-28 09:32:48
【问题描述】:
尝试在 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,特别是我正在尝试在子模块中实现自我注册的各种方法(具体来说,这些模块是使用子命令索引注册自己的子命令,然后提供如果且仅在选择特定子命令时,则将其参数设置为解析器)。
【问题讨论】:
-
我在下面给出了解释,但是还有很多关于你为什么要这样做的原因尚不清楚。一方面,你为什么要让你的装饰器成为一个类而不是一个函数?
-
@BrenBarn 我花了很多时间阅读有关装饰器的内容,并且“使用类”似乎是鼓励这样做的方式,以及其他 S/O 问题 (stackoverflow.com/questions/7492068/…) ..
标签: python python-3.x decorator python-decorators