重复初始化具有相同参数(金字塔)的类的最佳实践?

时间:2016-01-24 17:06:32

标签: python class inheritance initialization dry

我想简化/减少我的代码,所以我尝试将重复参数的类的初始化放在他们自己的扩展类中。这是一个基于Pyramid& amp;的REST API。檐口。

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

目前我已经想出了这个来扩展课程:

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)

但感觉并不正确。有更好,更清洁的方式吗?

2 个答案:

答案 0 :(得分:2)

在课堂上创建__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

答案 1 :(得分:1)

由于在实例化_401实例后使用了两种不同的方法,因此最好使用类级别的工厂方法,这将同时创建实例期望的标题:

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类来支持_401的任何未来子类化。