使用相同参数(金字塔)重复初始化 class 的最佳实践?

Best practice for repeatedly initializing a class with identical parameters (Pyramid)?

我想 streamline/reduce 我的代码,所以我尝试将带有重复参数的 classes 的初始化放在它们自己的扩展 classes 中。这是一个基于 Pyramid & Cornice 的 REST API。

当我总是在初始化时添加相同的 headers 时,如何初始化 pyramid.httpexceptions.HTTPUnauthorized?这也适用于我在不更改参数的情况下重复初始化它们的其他 HTTP 响应。

目前我想出了这个来扩展 class:

class _401(HTTPUnauthorized):
    def basic_jwt_header(self):
        self.headers.add('WWW-Authenticate','JWT')
        self.headers.add('WWW-Authenticate', 'Basic realm="Please log in"')
        return self

    def jwt_header(self):
        self.headers.add('WWW-Authenticate','JWT')
        return self

我在这样的视图中使用:

@forbidden_view_config()
def authenticate(request):
    response = _401()
    return _401.basic_jwt_header(response)

但是感觉和看起来都不对劲。有没有更好、更干净的方法?

在 class 上创建一个 __init__ 方法:

class _401(HTTPUnauthorized):

    def __init__(self):
        # call base class __init__ first, which will set up the
        # headers instance variable
        super(_401, self).__init__()
        # in Python 3, just use this:
        # super().__init__()

        # now add the headers that you always enter
        self.headers.add('WWW-Authenticate','JWT')
        self.headers.add('WWW-Authenticate', 'Basic realm="Please log in"')

resp = _401()
print resp.headers

由于您在实例化 _401 实例后使用了两种不同的方法,那么您最好使用 class-level 工厂方法,它将创建实例 设置所需 headers:

class _401(HTTPUnauthorized):

    @classmethod
    def basic_jwt_header(cls):
        ret = cls()
        ret.headers.add('WWW-Authenticate','JWT')
        ret.headers.add('WWW-Authenticate', 'Basic realm="Please log in"')
        return ret

    @classmethod
    def jwt_header(cls):
        ret = cls()
        ret.headers.add('WWW-Authenticate','JWT')
        return ret

resp = _401.basic_jwt_header()
print resp.headers

现在不需要创建 __init__,或调用 super() 或其他任何东西。我们使用 cls 而不是显式 _401 class 来支持 _401.

的任何未来子classing