[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