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.