Ett mer pythoniskt alternativ till getters och setters

Det finns en lite mer pythonisk variant av generiska lösningen att ha en get- respektive en set-metod för olika instansvariabler.

Python har något som kallas för properties, där man deklarerar att en variabel är en property och beskriver hur värdet för denna property ska hämtas och sättas. Se nedanstående exempel som jämför användning av getters och setters med användning av properties.

class Animal(object):
    def __init__(self, name):
        self.name = name

    def get_name(self):
        return self.name

    def set_name(self, name):
        self.name = name

Kod som använder instanser av Animal hade kunnat se ut på följande sätt:

animal1 = Animal("George")
print "My name is " + animal.get_name()
animal1.set_name("Jim")
print "I changed my name to " + animal1.get_name()

Nedan kommer en variant som använder properties. Vi använder ett understreck '_' som prefix för variabler bara är tänkta att användas innuti metoder i den egna klassen.

class PythonicAnimal(object):
    def __init__(self, name):
        self._name = name

    def _get_name(self):
        return self._name

    def _set_name(self, name):
        self._name = name

    name = property(_get_name, _set_name)

Kod som använder instanser av PythonicAnimal hade kunnat se ut på följande sätt:

p_animal1 = PythonicAnimal("George")
print "My name is " + p_animal.name
p_animal1.name = "Jim"
print "I chaPnged my name to " + p_animal1.name

Som ni ser används PythonicAnimal.name som om det vore en variabel, men det som händer är att specifika metoder tillämpas för att sätta respektive hämta värdet. Genom att Python tillhandahåller properties, kan man skriva klasser som använder publikt tillgängliga instansvariabler, men vid behov kapsla in dem bakom getters och setters.

Mer information hittas här: http://docs.python.org/2/library/functions.html#property


Sidansvarig: Jody Foo
Senast uppdaterad: 2013-02-18