Python - 基于参数动态初始化类

时间:2015-04-28 15:04:37

标签: python localization

背景:

我正在处理一个相当大的应用程序,它在整个应用程序中都有硬编码的字符串。应用程序需要进行本地化和翻译的时候到了。此时,所有(或几乎所有)硬编码字符串都被移动到具有字符串参数的适当命名的类中。

我需要做什么:

我尝试做的是让所有这些字符串类对象扩展基类。在该基类内部,我抓住了操作系统的默认语言环境,并希望在不同的文件夹中加载适当的本地化类。

到目前为止我所拥有的:

示例字符串类 - 文件名HeaderStrings.py

class TabLabels(BaseLanguageClass):
    label_one = 'Label 1'
    label_two = 'Label 2'
    label_three = 'Label 3'

BaseLanguageClass

class BaseLanguageClass(object):
    def __init__(self, os_locale=None):
        if os_locale is None:
            os_locale = locale.getdefaultlocale()[0]
        if os_locale == 'en_US':
            pass  #  Do nothing and just initialize the called class
        else:
            # Gets set to TabLabels
            string_class = str(self.___class__.__name__)

            # Gets set to HeaderStrings
            file_path = str(inspect.getfile(self.__class__)).split('\\')[-1].split('.')[0]

            try:
                object_i_want = getattr(__import__("path.to.l10n.classes.%s.%s" % (os_locale, file_path), 
                                                   fromlist=[string_class]), string_class)()
            except:
                pass

object_i_want正确获取了我需要的本地化类。但是,我需要能够返回此而不是实际调用的那个。如果导入失败,它只返回一个被调用的导入。我已经尝试将object_i_want分配给自己,但我知道这不会起作用,但我是出于绝望而尝试过的。

如果我这样做:

var = TabLabels(os_locale='fr').label_one,单步执行它会正确获取object_i_want的法语类,但var最终成为原始TabLables的实例,而不是fr.TabLabels

我所拥有的可能是非常hackish,我希望有一个更好的方法来做到这一点,而无需重构接近2000个文件。任何和所有的帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

在玩了一下之后,我已经确定最好的方法是使用TabLabels.label_one来实际重新调用我想要的类对象。

不幸的是,我的其他同事一直在直接引用静态变量,而不是创建类的新实例(TabLabels().label_one vs class BaseLanguageClass(object): def __new__(self, os_locale=None): if os_locale is None: os_locale = locale.getdefaultlocale()[0] if os_locale == 'en_US': return self else: # Gets set to TabLabels string_class = str(self).split('\\')[0].split('.')[-1].split('\'')[0] # Gets set to HeaderStrings file_path = str(self).split('\\')[0].split('.')[-2] try: return getattr(__import__("path.to.l10n.classes.%s.%s" % (os_locale, file_path), fromlist=[string_class]), string_class) except: return self )。因此,最终似乎需要进行大量的重构。除非有人有解决方案。

new Rectangle()