Po pierwsze, istnieje klasa A
z dwóch zmiennych klasowych i dwóch zmiennych instancji:Jaka jest różnica między zmiennymi klasowymi różnych typów?
In [1]: def fun(x, y): return x + y
In [2]: class A:
...: cvar = 1
...: cfun = fun
...: def __init__(self):
...: self.ivar = 100
...: self.ifun = fun
Widzimy, że obie klasy zmienna i instancja zmiennej typu int działa dobrze:
In [3]: a = A()
In [4]: a.ivar, a.cvar
Out[4]: (100, 1)
Jednak sytuacja zmieniły się, jeśli sprawdzimy zmienne typu funkcji:
In [5]: a.ifun, a.cfun
Out[5]:
(<function __main__.fun>,
<bound method A.fun of <__main__.A instance at 0x25f90e0>>)
In [6]: a.ifun(1,2)
Out[6]: 3
In [7]: a.cfun(1,2)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/future/<ipython-input-7-39aa8db2389e> in <module>()
----> 1 a.cfun(1,2)
TypeError: fun() takes exactly 2 arguments (3 given)
Wiem, że python przetłumaczył a.cfun(1,2)
do A.cfun(a,1,2)
, a następnie błąd został zgłoszony.
Moje pytanie jest: Ponieważ zarówno cvar
, jak i cfun
są zmiennymi klasy, dlaczego Python traktować je w różny sposób?
'ifun' jest podpisem pola obiektu' a', nie jest to metoda obiekt/klasa. Aby powiązać go z obiektem, użyj 'a.ifun = types.MethodType (fun, a)' – kalgasnik
http://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object – kalgasnik