У меня есть класс:
class A(object):
def __init__(self):
self._first=1
def a(self):
pass
Я хочу динамически добавить к нему метод, но я хочу, чтобы имя основывалось на вводе (в моем случае на основе атрибутов закодированного объекта, но это помимо сути). Итак, я добавляю методы, используя следующие:
#Set up some variables
a = "_first"
b = "first"
d = {}
instance = A()
#Here we define a set of symbols within an exec statement
#and put them into the dictionary d
exec "def get_%s(self): return self.%s" % (b, a) in d
#Now, we bind the get method stored in d to our object
setattr(instance, d['get_%s' % (b)].__name__, d['get_%s' % (b)])
Все это работает нормально, но с одной оговоркой:
#This returns an error
>>> print(instance.get_first())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: get_first() takes exactly 1 argument (0 given)
#This works perfectly fine
>>> print(instance.get_first(instance))
1
Почему мой экземпляр не передает себя новой функции?
self
, но это имя само по себе никоим образом не является волшебным, и функция не знает, что это часть экземпляра, если вы не привяжете ее к нему. - person Eric Renouf   schedule 11.06.2016