function.__name__
- это имя, под которым функция была изначально определена, она не имеет ничего общего с именем, под которым она доступна. На самом деле, весь смысл function.__name__
в том, чтобы правильно определить функцию, какое бы имя не использовалось для доступа к ней. Вы определенно хотите прочитать это для получения дополнительной информации о том, что "имена" Python являются .
Одним из возможных решений здесь является замена статического определения condition
на замыкание:
class Filter(object):
def __init__(self, column=['poi_id', 'tp.event'], access=['con', 'don']):
self.column = column
self.access = access
self.accessor_column = dict(zip(self.access, self.column))
self.set_conditions()
def set_conditions(self):
mapping = list(zip(self.column, self.access))
for column_name, accessor_name in mapping:
def accessor(name):
print("in {}.accessor '{}' for column '{}'".format(self, accessor_name, column_name))
return name
# this is now technically useless but helps with inspection
accessor.__name__ = accessor_name
setattr(self, accessor_name, accessor)
В качестве дополнительного примечания (совершенно не связанного, но я подумал, что вы, возможно, захотите это знать), использование изменяемых объектов в качестве аргументов функций по умолчанию - один из самых печально известных ошибок Python и может привести к совершенно неожиданным результатам, т.е. :
>>> f1 = Filter()
>>> f2 = Filter()
>>> f1.column
['poi_id', 'tp.event']
>>> f2.column
['poi_id', 'tp.event']
>>> f2.column.append("WTF")
>>> f1.column
['poi_id', 'tp.event', 'WTF']
РЕДАКТИРОВАТЬ:
спасибо за ваш ответ, но он не касается моей проблемы здесь. Моя проблема не в том, как функции названы или определены, моя проблема в том, что когда я использую setattr () и я устанавливаю атрибут, и я даю ему функцию в качестве значения, я могу получить доступ к значению и выполнить то, что делает значение, но так как это функция, почему она не возвращает свое имя как имя функции
Поскольку, как я уже объяснил выше, атрибут __name__
функции и имя атрибута (ов) экземпляра Filter
, относящихся к этой функции, абсолютно не связаны, и функция абсолютно не знает ничего о имена переменных или атрибутов, которые ссылаются на него, как объясняется в ссылочной статье, на которую я ссылался.
На самом деле тот факт, что объект, который вы передаете setattr
, является функцией, совершенно не имеет значения, для POV объекта это просто имя и объект, точка. И фактически тот факт, что вы связываете этот объект (функцию или просто независимо от объекта) с атрибутом экземпляра (напрямую или с использованием setattr()
, он работает точно так же) вместо простой переменной, также полностью не имеет значения - ни одна из этих операций не окажет никакого влияния на связанный объект (за исключением увеличения его счетчика ссылок, но это деталь реализации CPython - другие реализации могут реализовывать сборку мусора по-разному).