2013-05-27 4 views
1

Я обычный программист Lisp, изучающий Python. Я хотел бы иметь возможность построить функцию из частей. Например, если у меня есть класс с атрибутами, то я могу использовать точечную нотацию для доступа к значению атрибута экземпляра класса, но, по-видимому, я не могу построить функцию, чтобы сделать то же самое. В приведенном ниже коде я могу запросить a.attr1, но bar (a, attr1) не работает.Составление функций из атрибутов класса

class foo (object): 
    def __init__(self, x, y): 
     self.attr1 = x 
     self.attr2 = y 

a = foo(17,23) 

print a.attr1 

def bar (obj, fun): 
    print obj.fun 

bar(a, attr1) 

NameError: имя «attr1» не определен

Нет сомнений в том, что я не думал в «вещий» способом, но немного более сложный пример показывает, почему я хочу, чтобы это сделать. Предположим, я хочу, чтобы вернуть значения в Словаре отсортированный по атрибуту:

d = {} 
d['a'] = foo(17,23) 
d['b'] = foo(13,19) 

for v in sorted(d.values(), key = lambda x: x.attr1): print v.attr1 

Это прекрасно работает, но следующая функция не будет:

def baz (dict,attr): 
    for v in sorted(dict.values(), key = lambda x: x.attr): print v.attr1 

baz(d,attr1) 

NameError: имя «attr1» не определен

В Common Lisp я бы прошел в attr1, но, похоже, в Python не существует аналогичной функциональности. Какие-либо предложения? Благодаря!

ответ

2
def bar(obj, fun): 
    print(getattr(obj, fun)) 

bar(a, 'attr1') 

Проблема заключается в том, что питон не распознает attr1, по очень уважительной причине - там нет такого символа.

Аналогично:

def baz(d, attr): 
    for v in sorted(d.values(), key = lambda x: getattr(x, attr)): 
     print(v.attr1) 

>>> d = { 'a':foo(17,23), 'b':foo(13,19) } 
>>> baz(d, 'attr1') 
13 
17 

Большую часть времени, если вы делаете такие вещи, что вы на самом деле нужно, это простой словарь.

+0

Спасибо Элазар, что работает. Является ли getattr стандартным способом компоновки функций из атрибутов? Благодарю. – user2426206

+0

Стандартный способ - жестко закодировать их, но да. если вам что-то нужно динамически, вы должны использовать 'getattr'. Вот почему это [встроенная функция] (http://docs.python.org/2/library/functions.html#getattr). – Elazar

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