Мне нужно динамически добавить атрибут (содержащий кортеж или объект) к объектам python. Это работает для классов Python, написанных мной, но не для встроенных классов.
Рассмотрим следующую программу:
import numpy as np
class My_Class():
pass
my_obj = My_Class()
my_obj2 = My_Class()
my_obj.__my_hidden_field = (1,1)
my_obj2.__my_hidden_field = (2,1)
print(my_obj.__my_hidden_field, my_obj2.__my_hidden_field)
Это правильно печатает (1, 1) (2, 1)
. Однако следующая программа не работает.
X = np.random.random(size=(2,3))
X.__my_hidden_field = (3,1)
setattr(X, '__my_hidden_field', (3,1))
Обе приведенные выше строки выдают следующую ошибку # AttributeError: 'numpy.ndarray' object has no attribute '__my_hidden_field'
Теперь причина, найденная в этих вопросах (т.е. назначение атрибута встроенному объекту, Невозможно установить атрибуты класса объекта, python: динамическое добавление атрибутов во встроенный класс) - это Python не позволяет динамически добавлять атрибуты к встроенным объектам.
Выдержка из ответа: https://stackoverflow.com/a/22103924/8413477
Это запрещено намеренно, чтобы предотвратить случайные фатальные изменения встроенных типов (фатальные для частей кода, о которых вы никогда не задумывались). Кроме того, это делается для того, чтобы изменения не влияли на разные интерпретаторы, находящиеся в адресном пространстве, поскольку встроенные типы (в отличие от определяемых пользователем классов) являются общими для всех таких интерпретаторов.
Однако все ответы довольно старые, и мне очень нужно сделать это для моего исследовательского проекта.
Однако есть модуль, который позволяет добавлять методы в класс: https://pypi.org/project/forbiddenfruit/
Однако он не позволяет добавлять объекты/атрибуты к каждому объекту.
Любая помощь ?
id(X)
в качестве ключа и значения скрытого поля в качестве значения словаря? - person Michael Butscher   schedule 31.01.2019