Python:如何将某个对象的命名空间导入当前命名空间?

时间:2011-09-15 13:30:21

标签: python parameters namespaces self

我有一个Python类,它包含几个嵌套的参数组:

class MyClass(object):
    #some code to set parameters

    def some_function(self):
        print self.big_parameter_group.small_parameter_group.param_1
        print self.big_parameter_group.small_parameter_group.param_2
        print self.big_parameter_group.small_parameter_group.param_3

我想减少访问参数所需的代码。我应该在some_function的顶部放置什么来简单地通过名称访问参数(param_1,param_2,param_3)?我应该在MyClass中放置什么来为其所有方法应用此快捷方式,而不仅仅是some_function?

3 个答案:

答案 0 :(得分:6)

我会用

启动这个功能
spg = self.big_parameter_group.small_parameter_group

然后使用该缩写。我想,你可以在__init__()中定义这样的缩写,如果你想在前面self处使用它们。

答案 1 :(得分:2)

一种方法是为每种方法创建属性:

@property
def param_1(self):
    return self.big_parameter_group.small_parameter_group.param_1
@property
def param_2(self):
    return self.big_parameter_group.small_parameter_group.param_2
@property
def param_2(self):
    return self.big_parameter_group.small_parameter_group.param_2

另一种更强大但不太明确的方法是覆盖 getattr 方法,如下所示:

def __getattr__(self, name):
    import re
    p = re.compile('param_[0-9]+')
    if p.match(name):
        return getattr(self.big_parameter_group.small_parameter_group, name)
    else:
        return super(MyClass, self).__getattr__(name)

这适用于与正则表达式指定的格式相匹配的任何属性(param_ [某个数字])

这两种方法都可以让你调用self.param_1等,但这只是为了重新审视。如果要设置属性,还需要创建一个setter:

@param_1.setter
    def param_1(self, value): 
        print 'called setter'
        self.big_parameter_group.small_parameter_group.param_1 = value

或补充getattr

def __setattr__(self, name, value):
    import re
    p = re.compile('param_[0-9]+')
    if p.match(name):
        return setattr(self.big_parameter_group.small_parameter_group, name, value)
    else:
        return super(MyClass, self).__setattr__(name, value)

(尚未对这些进行测试,因此可能存在拼写错误,但概念应该有效)

答案 2 :(得分:1)

在您的初始化中,您可以随时使用。

self.local_param_1 = self.big_parameter_group.small_parameter_group.param_1