首页 > 解决方案 > 在子类中调用继承的类方法装饰器

问题描述

在这里,我有一个带有精美装饰器的基类:

import functools

class Model:

    def connect(func):
        """Handles opening and closing of connection. Uses functools to preserve docstring of wrapped function."""
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            try: 
                #stuff
            except Exception as e:
                raise e
            return result
        return wrapper

    @connect
    def get_tables(self):
        """return a list a tables"""
        pass

这是 Child 类:

class ChildModel(Model):

    def __init__(self, **kwargs):
        for k in kwargs:
            setattr(self, k, kwargs[k])

    @Model.connect
    def foo(self):
        pass

看来我必须打电话@Model.connect而不是@connect我得到NameError: name 'connect' is not defined,所以有没有办法使用 just @connect

标签: python-3.x

解决方案


不,几乎因为当前范围只是globals...

你可以这样做:

class ChildModel(Model):
    connect = Model.connect

另一种方式,您不必放入 connect Model,只需将其设为全局函数即可。


推荐阅读