Python: как я могу импортировать пространство имен некоторого объекта в текущее пространство имен? - PullRequest
2 голосов
/ 15 сентября 2011

У меня есть класс 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 ]

6 голосов
/ 15 сентября 2011

Я бы начал функцию с

spg = self.big_parameter_group.small_parameter_group

, а затем использовал бы это сокращение.Вы можете определить такие сокращения в __init__(), я полагаю, если вы хотите использовать их везде с self на передней панели.

2 голосов
/ 15 сентября 2011

Одним из способов является создание свойств для каждого из них:

@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 и т. Д., Но этотолько для восстановления.Если вы хотите установить атрибуты, вам также нужно создать сеттер:

@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)

(не проверял это такмогут быть опечатки, но концепция должна работать)

1 голос
/ 15 сентября 2011

Внутри вашего init вы всегда можете это сделать.

self.local_param_1 = self.big_parameter_group.small_parameter_group.param_1
...