68 <strong>Python</strong> - objektni jezikA.__init__(self)self.__X = 37# Pretvara se u self._B__XIako ovakva shema daje iluziju sakrivanja podataka, ne postoji stvarni mehanizam da bi se sprije£iopristup "privatnim" atributima neke klase. To zna£i da, ako su poznati klasa i njen atribut, onda seoni mogu dohvatiti s gore opisanim punim imenom iz bilo koje instance.7.5.5 Operatorsko punjenjeKorisni£ki objekti mogu se pro²iriti s novim operatorima, dodaju¢i posebne metode da zajedno rade sasvim <strong>Python</strong>-ovim ugraženim operatorima. Na primjer, sljede¢a klasa nadopunja kompleksne brojeve sastandardnim matemati£kim operatorima i prisilnim tipovima kako bi se ostvarilo mije²anje kompleksnihbrojeva s cijelim i realnim brojevima.class Complex:def __init__(self,real,imag=0):self.real = float(real)self.imag = float(imag)def __repr__(self):return "Complex(%s,%s)" % (self.real, self.imag)def __str__(self):return "(%g+%gj)" % (self.real, self.imag)# self + otherdef __add__(self,drugi):return Complex(self.real + drugi.real, self.imag + drugi.imag)# self - otherdef __sub__(self,drugi):return Complex(self.real - drugi.real, self.imag - drugi.imag)# -selfdef __neg__(self):return Complex(-self.real, -self.imag)# drugi + selfdef __radd__(self,drugi):return Complex.__add__(drugi,self)# other - selfdef __rsub__(self,drugi):return Complex.__sub__(drugi,self)# Prisilno pretvori ostale numeri£ke tipove u kompleksnidef __coerce__(self, drugi):if isinstance(drugi, Complex):return self,drugitry: # Provjeriti ako se moºe pretvoriti u floatreturn self, Complex(float(drugi))except ValueError:passU ovom primjeru, postoji nekoliko zanimljivih detalja:1. Prvo, normalno pona²anje od __repr__() je stvaranje stringa koji ¢e se izvr²iti kako bi se ponovnona£inio objekt. U ovom slu£aju stvara se string oblika "Complex(r,i)". U drugom slu£aju, metoda__str__() stvara string koji je namijenjen za lijepi formatirani izlaz (to je string koji ¢e se ispisatis pomo¢u print naredbe).2. Drugo, da bi se radilo s operatorima u kojima se kompleksni brojevi pojavljuju i na lijevoj i nadesnoj strani operatora, moraju se koristiti __op__() i __rop__() metode.
7.6. Testovi pripadnosti klasa i tipova 693. Kona£no, __coerce__ metoda koristi se u dohva¢anju operacija koje uklju£uju mije²ane tipovepodataka. U ovom slu£aju, drugi numeri£ki tipovi pretvaraju se u kompleksne brojeve tako da semogu koristiti u metodama kompleksne aritmetike.7.6 Testovi pripadnosti klasa i tipovaTrenuta£no, postoji odijeljenost izmežu tipova i klasa. To konkretno zna£i, da se ugraženi tipovi poputlista i rje£nika ne mogu specijalizirati naslježivanjem, jer ono za njih ne postoji. Isto tako niti klase nemogu denirati nove tipove. Ustvari, sve klasne denicije imaju tip ClassType, dok sve klasne instanceimaju tip InstanceType. Zbog toga je izraztype(a) == type(b)istinit, za bilo koja dva objekta koja su instance klase (£ak i ako su stvorena iz razli£itih klasa).Provjera pripadnosti klasi provodi se upotrebom ugražene funkcije isinstance(obj,cname). Ovafunkcija vra¢a istinu, ako objekt obj pripada klasi cname ili bilo kojoj klasi izvedenoj iz cname. Naprimjer:class A: passclass B(A): passclass C: passa = A()b = B()c = C()# Instanca od 'A'# Instanca od 'B'# Instanca od 'C'print isinstance(a,A)print isinstance(b,A)print isinstance(b,C)# Vra¢a True# Vra¢a True, B je izveden iz A# Vra¢a False, C nije izveden iz ASli£no, ugražena funkcija issubclass(A ,B ) vra¢a istinu ako je A podklasa klase B. Na primjer:issubclass(B,A)issubclass(C,A)# Vra¢a True# Vra¢a FalseFunkcija isinstance() moºe se koristiti za izvr²avanje provjere tipa s obzirom na bilo koji ugraženitip:import typesisinstance(3, types.IntType)isinstance(3, types.FloatType)# Vra¢a True# Vra¢a FalseOvo je preporu£en na£in provjere tipa mežu ugraženim tipovima, jer ¢e razlika izmežu tipova i klasamoºda i²£eznuti u budu¢im ina£icama <strong>Python</strong>-a.