[python] Getters and Setters.
rajcze
rajcze na gmail.com
Sobota Červen 21 18:19:29 CEST 2008
Ahoj,
vec se ma tak, ze pokud pouzivas get/set metody explicitne, tak delas
praci uplne zbytecnou.
Jednoduchy priklad:
# Trida
class C(object):
def __init__(self):
self.x = 0
def magic(self):
self.x = self.x * 10
# Program
pom = C()
pom.x = 11
print pom.x
pom.magic()
print pom.x
Vse je OK, ale z nejakeho obskurniho duvodu je najednou do x potreba
ukladat dvojnasobek kladnych prirazovanych hodnot, misto zaporneho
cisla nulu.
Neni nic jednodussiho, nez zmenit atribut x na property x. Property v
pythonu funguje tak, ze vytvorene property nadefinujes, jaka funkce se
vola pri "pristupu k property pro cteni (getter)" a pri "pristupu k
property pro zapis (setter)"
class C(object):
def __init__(self):
self._x = 0;
def magic(self):
self.x = self.x * 10
def get_x(self):
return(self._x)
def set_x(self, value):
if value >= 0:
self._x = value * 2
else:
self._x = 0
x = property(get_x, set_x)
Nyni muzu bezproblemu provest puvodni program
# Program
pom = C()
pom.x = 11
print pom.x
pom.magic()
print pom.x
a mam i pozadovane chovani. Vsimni si, ze pozadovana zmena chovani se
projevila i ve funkci C.magic() ktera k property x taktez pristupuje.
Pokud by ses tomuto chtel vyhnout, tak staci zmenit self.x na self._x
Cili tim ze explicitne volas get_x a set_x tak sice nedelas chybu, ale
delas zbytecnou praci a navic to vypada desne.
Joza
2008/6/21 David Michal <dmichal na altien.com>:
> Asi je to jen mou neznalosti, ale preci kdyz budu dusledne pouzivat get a
> set metody, tak si pri pripadne zmene atributu ulehcim praci, jelikoz takova
> zmena bude znamenat editaci pouze samotne tridy a nebudu muset prochazet
> cely kod a hledat kde vsude se na tridu odvolavam.
--
Rules of Optimization:
Rule 1: Don't do it.
Rule 2 (for experts only): Don't do it yet.
Další informace o konferenci Python