Python 动态设置具有装饰器的方法
我有这门课:Python 动态设置具有装饰器的方法,python,django-rest-framework,python-decorators,Python,Django Rest Framework,Python Decorators,我有这门课: class SomeMixin: 权限=(SomePermission,) 方法=('GET',) @列表路径(方法=方法,url\u path='en',权限\u类=权限) def en_列表(自身): 返回get_translated_对象(self,'en') @列表路径(方法=方法,url\u path='ru',权限\u类=权限) def ru_列表(自我): 返回get_translated_对象(self,'ru') @详细信息路径(方法=方法,url\u path=
class SomeMixin:
权限=(SomePermission,)
方法=('GET',)
@列表路径(方法=方法,url\u path='en',权限\u类=权限)
def en_列表(自身):
返回get_translated_对象(self,'en')
@列表路径(方法=方法,url\u path='ru',权限\u类=权限)
def ru_列表(自我):
返回get_translated_对象(self,'ru')
@详细信息路径(方法=方法,url\u path='en',权限\u类=权限)
def en_详细信息(自):
返回get\u translated\u对象(self.get\u对象(),'en')
@详细信息路径(方法=方法,url\u path='ru',权限\u类=权限)
def ru_详细信息(自身):
返回get\u translated\u对象(self.get\u对象(),'ru')
我将来可以有更多的语言,这不是一个好的解决方案。我想创建语言循环列表,并使用setattr(self,func_name,func)向类添加方法,如:
langs=('en','ru')
对于langs中的lang:
setattr(self,func.\uuuuu name\uuuuuu,func)
但是我应该在每个方法中添加decorators,我该怎么做?我相信您应该能够将这个示例的内容修补到代码中。也就是说,从http头检测语言并返回适当的响应似乎是一种更好的方法。 这种方法虽然很实用,但不是最干净的
# This decorator is meant to simulate the decorator exposed by django
def route(url, language, method):
def wrapper(func):
def inner(*args, **kwargs):
print('url => {0}'.format(url))
print('language => {0}'.format(language))
print('method => {0}'.format(method))
func(*args, **kwargs)
return inner
return wrapper
# This class is analogous to your SomeMixin class
class foo(object):
def __init__(self):
method = 'GET'
# fields holds the parameters that will change for each method like url
# and language
fields = (('en', '/en', 'en_list'), ('ru', '/ru', 'ru_list'))
for lang, url, func_name in fields:
setattr(self, func_name, route(url=url, language=lang, method=method)(self.func_creator(lang)))
def func_creator(self, language):
def inner():
print('hello in {0}'.format(language))
return inner
def main():
foo_instance = foo()
print('Calling foo.en_list()')
foo_instance.en_list()
print()
print('Calling foo.ru_list()')
foo_instance.ru_list()
if __name__ == '__main__':
main()
随着您添加更多语言,此代码将变得非常混乱。为什么不使用本地化头或其他东西动态地确定语言,并为每种语言提供一组方法,而不是静态路由?类似于<代码> GETXTrAtLeDestObjor(Fiel.GETYObjutter)、Sudi.Apvest.Meta(‘HtpPangLang'’)< /C> >您可能想考虑重写。