使用相同参数(金字塔)重复初始化 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
我想 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
.