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> >您可能想考虑重写。