2013-06-14 2 views
0

Давайте предположим, следующий случай:Какой самый лучший способ, чтобы получить объект ссылки (переменная уровня)

class foo(object): 
    def __init__(self, ref=None): 
     self.ref = ref 

    def __str__(self): 
     return "I'm foolish" 

f = foo() 
f.ref = foo() 
f.ref.ref = foo() 
f.ref.ref.ref = foo() 

Пытаюсь печати (GetAttr (F, "ref.ref.ref"))

raises 'foo' объект не имеет атрибута 'ref.ref.ref'.

Итак, я решил вопрос с помощью следующей функции:

def get_ref(ref_attr): 
    for attr in ref_attr.split('.'): 
     print(getattr(f, attr)) 

get_ref("ref.ref.ref") retruns the expected result: 
I'm foolish 
I'm foolish 
I'm foolish 

Я удивляюсь сам, если это еще один способ сделать это или встроенный метод, который я мог бы использовать.

Спасибо.

ответ

1

Это не то, что вы думаете: каждый раз получает первый элемент. Он работает только потому, что все уровни называются «ref». Если вы назвали их «foo.bar.baz», это потерпит неудачу. Вы должны фактически использовать элемент из последней итерации каждый раз:

def get_ref(ref_attr): 
    item = f 
    for attr in ref_attr.split('.'): 
     item = getattr(item, attr) 
     print item 

Но нет, нет встроенного способа сделать это.

+0

ОК, большое спасибо;) –

+2

'reduce (getattr, attribute_names, object)' – Bakuriu

+0

Отлично, @ Бакуриу. По какой-то причине я никогда не думаю об использовании 'reduce'. –

Смежные вопросы