python. почему не вызывается динамически созданный метод объекта
c.abc =f
на
A.abc = f
то работает, но всё равно не понятно, почему так сделано.
то работает, но всё равно не понятно, почему так сделано.Кажется, в заголовке этого треда написано о добавлении метода к классу, а не к объекту?
вопрос остаётся.
исправил.по-первых не испавил
вопрос остаётся.
должно быть:
A.abc = f
потому что мы добавляем функцию в класс "А" а не в объект "с"
во-вторых откуда ему знать что такое "a" в функциип "f"?
должно быть
for i in range(self.a):
Может как-то нужно сообщить, что abc - это не просто функция, а метод класса?Угадал Можно так:
def classwrap(obj):
def _wrap(f):
return lambda *a, **kw: f(obj, *a, **kw)
return _wrap
c = A
c.abc = classwrap(cf)
Сам подумай, как иначе ты обыкновенным присваиванием хочешь объяснить функции что надо получать какой-то конкретный объект в качестве первого аргумента?
obj.method1(a,b,c)
Видимо это некоторый опыт c++ наводит на мысль, что obj будет передан первым аргументом в такой записи.
С lambda идею понял. Просто прописываем в саму вызываемую фунцию ссылку на объект.
new.instancemethod
и в С++ всё точно так же вообще то
[xoft ~]$ cat test.cpp
#include <iostream>
using namespace std;
struct C
{
int x;
C: x(1) {}
int f(int y) {
return x+y;
}
int (*gint);
};
int g (int y) {
return y;
}
int main
{
C c;
c.g = g;
cout << c.f(2) << " " << c.g(2) << endl;
}
[xoft ~]$ ./test
3 2
не знал.
class C:
a = 5
c = C
class D(c.__class__):
def abc(self, abc):
for i in range(self.a):
print(abc)
c.__class__ = D
c.abc('a')
Т.е. хотя что-то и экземпляр класса, ничто не мешает сделать его экземляром другого, производного от изначального, класса.
Видимо, изначально я это и искал.
думаю, можно сделать экземпляром любого класса, я написал всё именно так для порядку, чтобы всё было честно - объект не перескочил в другую иерархию, все вызовы справедливы, объект можно использовать как раньше
Оставить комментарий
Phoenix
Что я не так делаю? Может как-то нужно сообщить, что abc - это не просто функция, а метод класса? (судя по тому, что ругается на 1 аргумент)