Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[Python] Klase i atributi

[es] :: Python :: [Python] Klase i atributi

[ Pregleda: 4991 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

alex
Aleksandar Radulovic
Senior Software Engineer, Spotify
Stockholm, Sweden

Član broj: 71
Poruke: 2194
*.habil.is

Jabber: alex@a13x.info
ICQ: -1
Sajt: www.a13x.info


+1 Profil

icon [Python] Klase i atributi20.06.2003. u 14:07 - pre 253 meseci
Posto, jelte, nema Python foruma ;) onda cu ovde postaviti mali tekst o klasama i atributima u Python jeziku.

Kao sto je poznato, klase u Python-u mogu imati dinamicki generisane atribute (promenljive). Pogledajte prost primer sledece klase:
Code:

class Object:
    one = None
    two = None

    def __init__(self, one, two):
        self.one = one
        self.two = two



A sad, kreirajmo objekat:
Code:

o = Object(12,23)
o.three = 23


Pri kreiranju objekta Object dodelili smo mu vrednosti za one i two a odmah u sledecoj liniji kreirali smo atribut three i dodelili mu vrednost. Naravno, three ne postoji kao atribut klase Object ali Python ipak dozvoljava ovakvu konstrukciju i dinamicki kreira taj atribut.

Medjutim, u odredjenim situacijama, zeleli biste da onemogucite kreiranje dinamickih atributa, a razloga ima dosta - zelite da vodite racuna koji atributi pripadaju kojim klasama, zelite da eliminisete mogucnost typo gresaka u pisanju vasih Python programa (dodeljujete vrednost dinamickom atributu koga ne koristite u kodu i slicno). Za to sluze __setattr__ i __getattr__ built-in metodi svake klase. Implementacija ovih metoda vam omogucava manipulaciju sa atributima i sa kreiranjem istih.

Pogledajmo sledeci primer:
Code:

class Object:
    one = None
    two = None

    def __init__(self, one, two):
        self.one = one
        self.two = two

    def __setattr__(self, Name, val):
        if hasattr(self, Name):
            self.__dict__[Name] = val
        else:
            raise AttributeError

    def __getattr__(self, Name):
        if hasattr(self,Name):
            return self.__dict__[Name]
        else:
            raise AttributeError


Ovde smo implementirali te metode u kojima proveravamo da li postoji atribut (sa funkcijom hasattr(). Sada, probajmo prethodni primer kreiranja klase:

Code:

o = Object(12,23)
o.three = 23


Sta se desava? Implementiranjem atributskih funkcija sprecili smo dinamicko kreiranje atributa i Python ce podici AttributeError gresku.

Zgodno, zar ne?

Pozdrav,
alex.
Alex: My favorite site is http://localhost/
R.J. Oppenheimer: "I am become death, destroyer of worlds" (1945 AD)
tweet.13x ||
linkedin.13x
 
Odgovor na temu

Au197/79
Zlatan Kadragić
Minhen

Član broj: 3556
Poruke: 772
*.ptt.yu

Sajt: aurelije.blogspot.com


+47 Profil

icon Re: [Python] Klase i atributi20.06.2003. u 16:29 - pre 253 meseci
Nešto mi nije jasno u postavci primera tj. onaj prvi kod mi je zbunjujuć. Prvo se deklarišu promenljive klase (statične promenljive) one i two, a posle se u __init__ metodi deklarisu promenljive instance sa istim imenima.

Ako su se vrednosti atributa __init__ metode želeli dodeliti promenjivim klase treba napisati
Code:
self.__class__.one = one
a ako se htelo napraviti promenljive instance tada se deklaracija izvan __init__ treba brisati kao nepotrebna.
Bolje džaba ležat nego džaba radit.
 
Odgovor na temu

alex
Aleksandar Radulovic
Senior Software Engineer, Spotify
Stockholm, Sweden

Član broj: 71
Poruke: 2194
*.habil.is

Jabber: alex@a13x.info
ICQ: -1
Sajt: www.a13x.info


+1 Profil

icon Re: [Python] Klase i atributi20.06.2003. u 17:07 - pre 253 meseci
Nesto si ti tu pogresno uocio. Evo sad sam pogledao dokumentaciju i moj primer korektno dodeljuje vrednost atributu one i two objekta Object. U mom primeru se u __init__-u dodeljuju atributima vrednosti za instancirani objekat o, ne za sam Object.

Pogledajmo sledeci primer:
Code:


class Object:
    one = None
    two = 23

    def __init__(self, one, two):
        self.one = one
        self.two = two

o = Object(1,2)
print o.one
print o.two


Output ce biti:
Code:

1
2


Ali, u klasi Object vrednost two ce biti i dalje 23. Sto znaci da je two u instanci objekta o zamenjen korektno, i da naravno nije zamenjen u objektu Object.

Code:

>>>Object.two
23


Ali, ako kazemo sledece:
Code:

>>>o.__class__.two = 22
>>>Object.two
22


Znaci, __class__ se koristi samo za zamenu definisanih atributa u super() objektu objekta o. Super objekat je objekat iz koga se izvodi instanca, u nasem slucaju to je Object.

Znaci, nema potrebe koristiti __class__ za dodeljivanje vrednosti atributima u koliko ne zelis i u samom super objektu da promenis tu vrednost. Ako vec radis sa instancom zasto bi menjao vrednost tog atributa u super objektu?

Nadam se da sam razjasnio situaciju.
Alex: My favorite site is http://localhost/
R.J. Oppenheimer: "I am become death, destroyer of worlds" (1945 AD)
tweet.13x ||
linkedin.13x
 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.dial.InfoSky.Net

Sajt: localhost


+5 Profil

icon Re: [Python] Klase i atributi20.06.2003. u 19:35 - pre 253 meseci
a baš kada sam se rešio da uzmem da proučavam ovaj pyton, vidim ovo i prilično se začudim..

kako bre to da se kod svake deklaracije metode mora navoditi self kao prvi parametar. gde je tu klasa. to kao da je samo običan skup funkcija.. baš čudno...


btw, alex, možeš ti a i drugi py profesionalci da pokažete nekoliko dobrih sajtova za početak učenja pytona... (posebna tema naravno..)

 
Odgovor na temu

alex
Aleksandar Radulovic
Senior Software Engineer, Spotify
Stockholm, Sweden

Član broj: 71
Poruke: 2194
*.habil.is

Jabber: alex@a13x.info
ICQ: -1
Sajt: www.a13x.info


+1 Profil

icon Re: [Python] Klase i atributi20.06.2003. u 19:50 - pre 253 meseci
Pa self je rezervisana rec i oznacava pripadnost metoda klasi u okviru koje je definisana. Slicno kao u C++:

Code:

void Objekat::Metod()


Nekima mozda izgleda malo nezgrapno ali je u sustini sasvim ok konstrukcija.

Linkovi za ucenje Python jezika ce ici u Python forum, kad i ako bude otvoren. Ako ne bude otvoren postavicu ih u ovaj forum.
Alex: My favorite site is http://localhost/
R.J. Oppenheimer: "I am become death, destroyer of worlds" (1945 AD)
tweet.13x ||
linkedin.13x
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-3.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: [Python] Klase i atributi20.06.2003. u 20:01 - pre 253 meseci
Alex, koliko ja znam do Python-a 2.3 „self“ nije bila rezervisana reč već je svako mogao da stavi kao prvi parametar šta želi, i zatim to da koristi. Jedino svi preporučuju da se koristi „self“ kako bi ostali programeri lakše razumeli kod. Takođe, na ovaj način se izbegava misteriozno „this“ koje treba objasniti u C++ programu ;-)

Takođe, zašto je obavezno koristiti to „self“? Pa, jednog lepog dana su programeri Python-a došli do zaključka da ne valja koristiti previše promenljivih samog objekta u kodu, već da je bolje koristiti lokalne promenljive za jednu funkciju (ovo je moja interpretacija, beskonačni flejmovi se vode na Python njuzgrupama u vezi sa ovim pitanjem). Zato su rešili da lokalna imena rezervišu za njih, a za sve što je član matične klase je potrebno to i naznačiti. Uz to, tvrde kako to povećava čitljivost koda.

Zombie, što se tiče „skup funkcija“ to ti važi za C kada se u njemu emulira OOP. Ono što su mnogo važniji koncepti su polimorfizam (pošto je Python interpreter, nije potrebna ključna reč tipa „virtual“), izvođenje/nasleđivanje klasa, i slično. Naravno, tu je i „operator overloading“ sa lepom sintaksom (mada je opet teže zapamtiti ako ne razmišljate na engleskom jeziku ;-).

I ne zaboravimo da je Piton „samodokumentujući“: kada ne znaš kako glasi sintaksa nečega, pokreneš interpreter i ukucaš „help(klasa)“ i slično (izvlači prvi tekst koji sledi iza deklaracije, koga i sam možeš pozvati sa __doc__).

Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

Au197/79
Zlatan Kadragić
Minhen

Član broj: 3556
Poruke: 772
*.ptt.yu

Sajt: aurelije.blogspot.com


+47 Profil

icon Re: [Python] Klase i atributi20.06.2003. u 20:31 - pre 253 meseci
U svakoj dokumentaciji piše da sve što je izvan metoda deklarisano je promenljiva klase ili kako u javi kažu statična varijabla. Ona je vezana za samu klasu i postoji čak i u slučaju da ne postoji ni jedna instanca i može joj se pristupiti uz uobičajene načine i preko ime_klase.atribut.

Ono unutar metoda kada se dodeljuje je promenljiva instance i specifična je za svaki objekat.

Posto python nema posebnu rec za oznacavanje promenljivih klase ili instance tada svaka dodela nekoj promenljivoj koja nije ranije korišćena u metodi znači stvaranje nove promenljive instance.

Kada se pristupa promenljivoj prvo se pretražuju promenljive instance, pa promenljive klase, eventualno promenljive nadklasa i kada se nađe pretraga se prekida ako se ne nađe vrati se izuzetak.

Znajuci ovo sledi da:
Code:
self.one = one
stvara promenljivu instance sa imenom one koja nema nikakve veze sa ovom promenljivom klase istog imena
Code:
one = None
sem što je prikriva jer se pri pristupu prvo pretraže promenljive instance.

Pokazao si svojim primerom da statička prom. one je ostala nepromenjena a ova druga istog imena se menja. Dakle imamo 2 totalno nezavisne promenljive a jedna od njih nam za primer ne treba a pošto su istog imena samo zbunjuju.

Znači preiče o zamenjivanju vrednosti ne stoje. Tu se apsolutno ništa ne menja već se stvara nova prom. istog imena. A kada se pristupa sa o.one prvo se pretraže prom instance i ona se ispiše ali se tako sakriva taj instanca.statickapromenljiva pristup, ali nam ostaje ime_klase.statickapromenljiva.

Kada se statickoj promenljivoj menja vrednost mora se raditi sa __class__ jer ako se to ne uradi python će napraviti novu prom. instance istog imena mesto da promeni vrednost postojeće klasne prom. Obrnuto ako joj se samo pristupa (i ako se nije deklarisana prom. instance istog imena) nema potrebe pisati __class__

Tvoj kod je u suštini ekvivalentan ovome:
Code:

class Object:
    StaticPromKojuNeKoristim = None
    StaticPromKojaMiNeTrebaAZbunjuje = None

    def __init__(self, jedan, dva):
        self.one = jedan
        self.two = dva


Verujem da ti je namera (a to si i rekao u 2. postu) da se napise nešto ovako:
Code:

class Object(object):
    def __init__(self, jedan, dva):
        self.one = jedan
        self.two = dva

[/code]

Stavio sam da se nasleđuje klasa object koja već postoji kao nadklasa svih klasa (kao u javi). Još se ne mora eksplicitno nasleđujivati object ali je to dobra praksa jer činimi se da će to sa novom verzijom pythona biti obavezno (to su kao neki new-style classes) a i u dokumentaciji se tako radi.

Listajući dokumentaciju pythona naišao sam na stvari koje se tiču ovoga o čemu je g. Alex pričao. Ima mnogo novina.
Citat:
Finally, it's possible to constrain the list of attributes that can be referenced on an object using the new __slots__ class attribute. Python objects are usually very dynamic; at any time it's possible to define a new attribute on an instance by just doing obj.new_attr=1. This is flexible and convenient, but this flexibility can also lead to bugs, as when you meant to write obj.template = 'a' but made a typo and wrote obj.templtae by accident.

A new-style class can define a class attribute named __slots__ to constrain the list of legal attribute names. An example will make this clear:


>>> class C(object):
... __slots__ = ('template', 'name')
...
>>> obj = C()
>>> print obj.template
None
>>> obj.template = 'Test'
>>> print obj.template
Test
>>> obj.templtae = None
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'C' object has no attribute 'templtae'

Note how you get an AttributeError on the attempt to assign to an attribute not listed in __slots__.


U pythonu 2.2 uveden je i novi tip property, uvedena je i nova ugrađena metoda __getattribute__(attr_name), a stara __getattr__(attr_name) se poziva samo u slučaju da atribut attr_name nije pronađen (što znači da je nepotrebni koristiti hasattr funkciju)...

Ovo o statičkim i promenljivim instance je fino obrađeno u Dive Into Python tutorijalu (najbolji python tutorijal koji sam čitao) u odeljku 3.8.

Stvarno zaslužujemo forum :)

[Ovu poruku je menjao Au197/79 dana 22.06.2003. u 09:00 GMT]
Bolje džaba ležat nego džaba radit.
 
Odgovor na temu

Au197/79
Zlatan Kadragić
Minhen

Član broj: 3556
Poruke: 772
*.ptt.yu

Sajt: aurelije.blogspot.com


+47 Profil

icon Re: [Python] Klase i atributi20.06.2003. u 21:13 - pre 253 meseci
Citat:
-zombie-:
kako bre to da se kod svake deklaracije metode mora navoditi self kao prvi parametar. gde je tu klasa. to kao da je samo običan skup funkcija.. baš čudno...


btw, alex, možeš ti a i drugi py profesionalci da pokažete nekoliko dobrih sajtova za početak učenja pytona... (posebna tema naravno..)

www.diveintopython.org brz i moćan tutorijal za već iskusne programere.

A i dokumentacija koja se dobija sa samim interpreterom u html obliku je odlična (www.python.org).

Self se navodi jer je autor pythona želeo da ima čist jezik pogodan za učenje. Naime kada se u javi napiše ime_instance.metod(atribut) to se u suštini svodi na poziv funkcije: metod(ime_instance, atribut) u namespace-u klase čija je instanca ime_instance. Tu se ime_instance prenosi automatski, tajno na parametar koji se zove this. A Gvido nije želeo išta da radi iza leđa pa je napravio da se mora pisati taj parametar koji će ukazivati na tekuću instancu. I tOwk je u pravu to je samo jak dogovor da se piše self, a može bilo šta. Samim tim pri pristupu promenljivoj ili pri deklaraciji promenljive instance tekuce klase i pristupu metodu tek. kl. mora se pisata self. A svakako da važi i ono što je rečeno za lokalne promenljive unutar metoda.
Bolje džaba ležat nego džaba radit.
 
Odgovor na temu

Au197/79
Zlatan Kadragić
Minhen

Član broj: 3556
Poruke: 772
*.ptt.yu

Sajt: aurelije.blogspot.com


+47 Profil

icon Re: [Python] Klase i atributi21.06.2003. u 16:13 - pre 253 meseci
Uspeo sam da provalim čemu one statične promenljive istog imena kao i nestatične. Ono je nepotrebno komplikovanje koje zbunjuje i ljude koji imaju više dodira sa python-om. Može se napisati suštinski isti ali mnogo jasniji kod:
Code:

class Primer:
    __dozvoljeno = ('one', 'two')

    def __init__(self, one, two):
        self.one = one
        self.two = two

    def __setattr__(self, kljuc, vrednost):
        if kljuc in Primer.__dozvoljeno:
            self.__dict__[kljuc] = vrednost
        else:
            raise AttributeError, 'ne postoji promenljiva: ' + kljuc


Ovde se ispituje da li se ime novog atributa nalazi u statičnom tupeu dozvoljenih i u zavisnosti od toga stavlja se u asocijativni niz __dict__ koji čuva promenljive instancea ili se okida izuzetak.

Mislim da je ovo jasnije od ispitivanja sa hasattr() da li klasa ima statičku promenljivu one pa ako ima onda se stvori promenljiva instance istog imena koja zakloni pristup statičkoj kroz self.one ili ime_instance.one, iako suštinske razlike nema.

Ipak najboji način za rešavanje ovakih problema je upotreba tzv. new-style klasa i atributa klase __slots__:
Code:

class Nov(object):
    __slots__ = ('one', 'two')
    
    def __init__(self, one, two):
        self.one = one
        self.two = two


[Ovu poruku je menjao Au197/79 dana 22.06.2003. u 09:05 GMT]
Bolje džaba ležat nego džaba radit.
 
Odgovor na temu

alex
Aleksandar Radulovic
Senior Software Engineer, Spotify
Stockholm, Sweden

Član broj: 71
Poruke: 2194
*.du.heimsnet.is

Jabber: alex@a13x.info
ICQ: -1
Sajt: www.a13x.info


+1 Profil

icon Re: [Python] Klase i atributi22.06.2003. u 02:53 - pre 253 meseci
Tacno, __slots__ je najbolji nacin, no, cini mi se da ce se tek pojaviti u Python 2.3.
Sad cu da pogledam dokumentaciju.

Elem, ova diskusija mi je ubedljivo najinteresantnija na ES-u za duze vreme.

Ocemo Python forum!
Alex: My favorite site is http://localhost/
R.J. Oppenheimer: "I am become death, destroyer of worlds" (1945 AD)
tweet.13x ||
linkedin.13x
 
Odgovor na temu

Au197/79
Zlatan Kadragić
Minhen

Član broj: 3556
Poruke: 772
*.ptt.yu

Sajt: aurelije.blogspot.com


+47 Profil

icon Re: [Python] Klase i atributi22.06.2003. u 08:58 - pre 253 meseci
Jeste dobra diskusija!

Ovo sa slots sam probao na: Python 2.2.1 (#34, Apr 9 2002, 19:34:33) [MSC 32 bit (Intel)] on win32, radi bez ikakvih from __future__ import ... zezalica.

Fora je da to mora biti new-stayle klase, dakle da se napiše da im je nadklasa object.

Python je jako dinamičan jezik stalno se menja. Dobra im je stvar što ipak promene koje su značajnije uvode polakao. Prvo u __future__ modulu a posle u nekoj sledećoj verziji to postaje sastavni deo jezika.

Hoćemo forum, hoćemo forum, hoćemo forum, hoćemo forum, hoćemo forum, hoćemo forum, hoćemo forum, hoćemo forum, hoćemo forum, hoćemo forum!
Bolje džaba ležat nego džaba radit.
 
Odgovor na temu

alex
Aleksandar Radulovic
Senior Software Engineer, Spotify
Stockholm, Sweden

Član broj: 71
Poruke: 2194
*.du.heimsnet.is

Jabber: alex@a13x.info
ICQ: -1
Sajt: www.a13x.info


+1 Profil

icon Re: [Python] Klase i atributi22.06.2003. u 18:07 - pre 253 meseci
Ono sto mi se najvise svidja kod te Python dinamicnosti je sto iako koristis __future__ i izadje sledeca verzija Python jezika sa ubacenim novim mogucnostima svoj kod uopste ne moras da menjas - __future__ ce i dalje raditi!

Guido jako insistira na backward compatibility.
Alex: My favorite site is http://localhost/
R.J. Oppenheimer: "I am become death, destroyer of worlds" (1945 AD)
tweet.13x ||
linkedin.13x
 
Odgovor na temu

Au197/79
Zlatan Kadragić
Minhen

Član broj: 3556
Poruke: 772
*.ptt.yu

Sajt: aurelije.blogspot.com


+47 Profil

icon Re: [Python] Klase i atributi23.06.2003. u 08:33 - pre 253 meseci
Postoji i neka skripta koja se sa python-om dobija koja uklanja nepotrebne __future__ importe iz koda kada oni sa novom verzijom postanu standardni.
Bolje džaba ležat nego džaba radit.
 
Odgovor na temu

[es] :: Python :: [Python] Klase i atributi

[ Pregleda: 4991 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.