Wpis z mikrobloga

Znacie jakąś fajną stronkę gdzie wyjaśnione jest dokładnie o co chodzi z tym parametrem 'self' i kiedy dokładnie się go wstawia? Chodzi mi też o sytuacje, gdy odwołujecie się do jakiejś funkcji z innego pliku po imporcie.
Przyznam, że robię to już od jakiegoś czasu tak trochę na czuja i niby wszystkie klasy, metody itd. działają, ale nie do końca wiem po co to się robi...
Może być po angielsku, ale nie ukrywam, że w ojczystym pewnie będzie jeszcze łatwiej to załapać.

#python #naukaprogramowania
  • 7
  • Odpowiedz
@max1983: Wszystkie metody obiektu przyjmują ten obiekt jako pierwszy parametr. Zgodnie z konwencją nazywa się go self, ale zasadniczo nie stoi nic na przeszkodzie, żeby go nazwać max1983:

class Foo(object):
__def bar(max1983):
____assert isinstance(max1983, Foo)
f = Foo()
f.bar() # Nie rzuca AssertionError
Dalej... metody możesz oznaczyć jako statyczne lub metody klasy przy pomocy dekoratorów, odpowiednio staticmethod i classmethod. Wtedy albo ten parametr nie jest w ogóle przekazywany,
  • Odpowiedz
Takie wytłumaczenie starczy? :)


@m_bielawski: Nie. :)

Ja wiem, że metody obiektu przyjmują go jako pierwszy parametr itd. Wielokrotnie sam go używałem. Tylko, że to nie jest wytłumaczenie.
Chciałbym jakieś źródło gdzie łopatologicznie tłumaczą DLACZEGO tak jest i po co właściwie się to robi.
Np. "gdyby nie było tego 'self' to python nie wiedziałby, czy chodzi o to, czy o tamto, a dzięki temu robi to i to".

Chodzi o to,
  • Odpowiedz
@max1983: a, no to w takim razie...

Kod "wewnątrz klasy" to zwykły kod pythonowy. Możesz spokojnie mieć tam ify, pętle i cokolwiek zapragniesz (proof). Tak naprawdę, to konstrukcja

class Foo(object):
__pass
to "tylko" tzw. syntactic sugar na wywołanie

type('Foo', (object,), {})
Ten type tutaj to tzw. metaklasa, która odpowiada za tworzenie obiektów klas (nie instancji klas, chodzi o to, że Foo tutaj też jest obiektem). Ta metaklasa sprawdza potem
  • Odpowiedz
@max1983: self to referencja do obiektu na którym jest wywoływana dana metoda.

class Klasa():
....def metoda(self, obiekt):
........print self == obiekt

obiekt = Klasa()
obiekt.metoda(obiekt)

jaśniej się nie da
  • Odpowiedz
@max1983: Ja to rozumiem tak, że klasa operuje na instancji samej siebie.
Czyli definicja klasy jest tylko martwym szablonem. Natomiast kiedy się już stworzy obiekt (instantiation) to ten obiekt żyjie i robi różne rzeczy - w tym - robi samemu sobie różne rzeczy. I żeby zakomunikować temu obiektowi, że ma coś zrobić na sobie samym - używa się self.
  • Odpowiedz