setattr не передает self в методы, добавленные в класс

У меня есть класс:

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

Почему мой экземпляр не передает себя новой функции?


person Alex Barry    schedule 11.06.2016    source источник
comment
Поэтому мне нужно привязать функцию к объекту с помощью: d ['get_% s'% (b)] .__ get __ (d ['get_% s'% (b)], A)?   -  person Alex Barry    schedule 11.06.2016
comment
Верно, все, что у вас есть в противном случае, - это функция, которая принимает один аргумент, который вы случайно назвали self, но это имя само по себе никоим образом не является волшебным, и функция не знает, что это часть экземпляра, если вы не привяжете ее к нему.   -  person Eric Renouf    schedule 11.06.2016