Я обычный программист 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 не существует аналогичной функциональности. Какие-либо предложения? Благодаря!
Спасибо Элазар, что работает. Является ли getattr стандартным способом компоновки функций из атрибутов? Благодарю. – user2426206
Стандартный способ - жестко закодировать их, но да. если вам что-то нужно динамически, вы должны использовать 'getattr'. Вот почему это [встроенная функция] (http://docs.python.org/2/library/functions.html#getattr). – Elazar