Итак, я рассмотрел похожие вопросы, и я нашел некоторые решения для этого, но я не могу понять, как это сделать.exec, чтобы добавить функцию в класс
Что я пытаюсь сделать, это добавить метод к классу из строки. Я могу сделать это с помощью метода setattr()
, но это не позволит мне использовать self
в качестве атрибута в дополнительном методе. Вот пример: (и я извиняюсь за имена переменных, я всегда использую YOLO когда я насмешливо от идеи)
class what:
def __init__(self):
s = 'def yolo(self):\n\tself.extra = "Hello"\n\tprint self.extra'
exec(s)
setattr(self,"yolo",yolo)
what().yolo()
возвращает это:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: yolo() takes exactly 1 argument (0 given)
и если s = 'def yolo():\n\tself.extra = "Hello"\n\tprint self.extra'
тогда я получаю этот результат:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 2, in yolo
NameError: global name 'self' is not defined
Это по существу означает, что я не могу динамически создавать методы для классов, которые я знаю, это плохая практика и unpythonic, потому что метамфетамин ods не смогут получить доступ к переменным, доступ к которым принадлежит остальной части класса.
Я ценю любую помощь.
* Почему вы хотите динамически добавлять методы в класс? – Ivo
@ Иво Ха-ха ... Это потому, что я могу иметь достаточно хорошую причину? – Hovestar
Нет, потому что он совершенно неспокойный. Я слышу, как рубин любит это дерьмо. – Ivo