class A(object):
def function(self):
print "asfasf"
def __init__(self):
A.a = A.function
A.z = [A.function]
a = A()
a.a()
a.z[0]()
a tak wyglada sytuacja po uruchomieniu:
tmp $ python a.py
asfasf
Traceback (most recent call last):
File "a.py", line 11, in <module>
a.z[0]()
TypeError: unbound method function() must be called with A instance as
first argument (got nothing instead)
Co jest nie tak z ostatnia linijka ze nie chce sie uruchomic?
--
nie wołasz __setattr__ z funkcją jako argument na A, wtedy funkcja nie
zostanie zbindowana.
użyj:
A.z[0](a)
albo:
a.z[0] = new.instancemethod(A.function, a, A)
Z jeszcze innej strony możesz to obsłużyć definiując własny __setattr__
dla __metaclass__ przybindowanej dla A.
lopex
a.z[0] jest metodą unbound, czyli jeszcze nieprzekształconą z postaci
function(object) do object.function(). Wystarczy wywołać a.z[0](a)
Piotr Sawicki
>
> nie wołasz __setattr__ z funkcją jako argument na A, wtedy funkcja nie
> zostanie zbindowana.
>
> użyj:
>
> A.z[0](a)
>
> albo:
>
> a.z[0] = new.instancemethod(A.function, a, A)
>
> Z jeszcze innej strony możesz to obsłużyć definiując własny __setattr__
> dla __metaclass__ przybindowanej dla A.
>
>
nie chodzi mi nawet o sposob obejscia tego tylko dlaczego jesli funkcji
jest w tablicy to jest unbound a jesli nie to nie jest:
a.a() #dziala
a.z[0]() #unbound
i co to znaczy ze metoda jest unbound?
Intepreter wie, że to jest metoda, więc przekazuje instancję a jako
pierwszy parametr.
> a.z[0]() #unbound
Interpreter wie, że a.z to lista, a.z[0] zwraca funkcje, ale intepreter
nie ma pojęcia, że ta funkcja ma być metodą instancji a.
> i co to znaczy ze metoda jest unbound?
Znaczy, że nie jest przywiązana do żadnej instancji.
bart
--
"Nigdy nie popełniamy dwa razy tych samych błędów" (c)TP S.A. <0800221122,*,4>
http://candajon.azorragarse.info/ http://azorragarse.candajon.info/
> nie chodzi mi nawet o sposob obejscia tego tylko
> dlaczego jesli funkcji jest w tablicy to jest unbound a jesli
> nie to nie jest:
Bo to nie funkcja ale metoda
> a.z[0]() #unbound
Skad ma wiedziec na rzecz czego wywolujesz cialo funkcji ?
f = a.z[0]
f to jest metoda # a raczej metka do metody
f(a) # wywolanie metody f na rzecz a
Dla Pythona a.metoda() === metoda(a)
Nie da rady a.metoda bo metka metoda jest widziana jedynie
w obrebie obiektu (Py szuka w slowniky klasy obiektu).
AK
To akurat nie ma tutaj znaczenia:
def foo(self):
print "foo"
class A:
pass
A.bar = foo
A().bar()
>> a.z[0]() #unbound
>
> Skad ma wiedziec na rzecz czego wywolujesz cialo funkcji ?
> f = a.z[0]
> f to jest metoda # a raczej metka do metody
> f(a) # wywolanie metody f na rzecz a
>
> Dla Pythona a.metoda() === metoda(a)
> Nie da rady a.metoda bo metka metoda jest widziana jedynie
> w obrebie obiektu (Py szuka w slowniky klasy obiektu).
>
> AK
>
>
Dokładnie chodzi o domyślny __setattr__ który jak zobaczy funkcję to ją
zbinduje, można go podmienić żeby działał podobnie dla tablic, trzeba mu
tylko powiedzieć jak tą funkcję wypakować:
class Meta(type):
def __setattr__(self, name, val):
if type(val) is list:
type.__setattr__(self, name, val[0])
else:
type.__setattr__(self, name, val)
class A(object):
__metaclass__ = Meta
def foo(self):
print "foo"
def __init__(self):
A.foo1 = self.foo
A.foo2 = [self.foo]
a = A()
a.foo1()
a.foo2()