Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Wywolanie funkcji z listy nalezacej do zmiennej statycznej

1 view
Skip to first unread message

Sulsa

unread,
Apr 29, 2008, 7:06:25 PM4/29/08
to
Pytanie opisze kodem:

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?

--

Marcin Mielżyński

unread,
Apr 29, 2008, 8:30:31 PM4/29/08
to
Sulsa pisze:

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

Piotr Sawicki

unread,
Apr 29, 2008, 8:31:00 PM4/29/08
to
Sulsa powiada :

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

Sulsa

unread,
Apr 30, 2008, 5:45:26 AM4/30/08
to
On Wed, 30 Apr 2008 02:30:31 +0200
Marcin Mielżyński <lo...@gazeta.pl> wrote:


>
> 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?

Bart Ogryczak

unread,
Apr 30, 2008, 6:15:10 AM4/30/08
to
On 2008-04-30, citizen Sulsa testified:

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/

Adam Karpierz

unread,
Apr 30, 2008, 9:28:26 AM4/30/08
to
Użytkownik "Sulsa" <su...@dontmail.me> napisał:

> 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


Marcin Mielżyński

unread,
Apr 30, 2008, 1:00:18 PM4/30/08
to
Adam Karpierz pisze:
> U¿ytkownik "Sulsa" <su...@dontmail.me> napisa³:

>
>> 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
>

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()

0 new messages