V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
chaleaochexist
V2EX  ›  Python

Python -- 类装饰器会被子类继承吗...

  •  
  •   chaleaochexist · 2019-03-28 14:03:54 +08:00 · 3750 次点击
    这是一个创建于 2060 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现实里真的会遇到这种情况...之前从没考虑过,.
    第 1 条附言  ·  2019-03-28 16:08:28 +08:00

    如果我装饰器没写错,答案是会报错. 目前正在尝试把wrapper写成类.

    def desc(cls):
        def wrapper(*args, **kwargs):
            print(123)
            return cls(*args, **kwargs)
    
        return wrapper
    
    
    @desc
    class FOOA(object):
        pass
    
    
    class FOOB(FOOA):
        pass
    
    
    f = FOOB()
    
    
    第 2 条附言  ·  2019-03-28 16:13:03 +08:00
    标准答案是,取决于你的装饰器是怎么写的.
    ```
    def desc(cls):
    class wrapper(object):
    def __new__(cls2, *args, **kwargs):
    print (123)
    cls.a = 111
    return object.__new__(cls, *args, **kwargs)
    return wrapper


    @desc
    class FOOA(object):
    pass


    class FOOB(FOOA):
    pass


    f = FOOB()
    print (f.a)

    ```
    3 条回复    2019-03-28 17:52:21 +08:00
    chaleaochexist
        1
    chaleaochexist  
    OP
       2019-03-28 14:04:08 +08:00
    晚上下班回家我会试试,
    Trim21
        2
    Trim21  
       2019-03-28 14:08:45 +08:00
    应该是不会, 类装饰器只是把这个类在定义的时候处理了一遍, 子类继承到的是被处理之后的类, 这里可能会受一定的影响, 而不会继承装饰器.
    yushenglin
        3
    yushenglin  
       2019-03-28 17:52:21 +08:00
    第一个装饰器相当于返回了一个函数,类不能继承函数类型,肯定会报错呀,第二个相当于重写了类的__new__()函数,下面的类继承了,肯定会有影响呀
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2904 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:22 · PVG 22:22 · LAX 06:22 · JFK 09:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.