Get Set metodai - DonatasNoreika/python1lygis GitHub Wiki

Kada gali prireikti get/set metodų?

class Darbuotojas:
    def __init__(self, vardas, pavarde, atlyginimas):
        self.vardas = vardas
        self.pavarde = pavarde
        self.atlyginimas = atlyginimas

domas = Darbuotojas("Domas", "Rutkauskas", 1200)
domas.atlyginimas = 1500
print(domas.atlyginimas)

Problema

domas = Darbuotojas("Domas", "Rutkauskas", 1200)
domas.atlyginimas = -150
print(domas.atlyginimas)

Variantas:

class Darbuotojas:
    def __init__(self, vardas, pavarde, atlyginimas):
        self.vardas = vardas
        self.pavarde = pavarde
        self.__atlyginimas = atlyginimas

    def set_atlyginimas(self, naujas):
        if naujas < 0:
            print("Atlyginimas negali būti neigiamas")
        else:
            self.__atlyginimas = naujas

domas = Darbuotojas("Domas", "Rutkauskas", 1200)
domas.set_atlyginimas(-1200)

# Atlyginimas negali būti neigiamas

print(domas.atlyginimas)

# AttributeError: 'Darbuotojas' object has no attribute 'atlyginimas'

Galime sukurti ir getterį:

class Darbuotojas:
    def __init__(self, vardas, pavarde, atlyginimas):
        self.vardas = vardas
        self.pavarde = pavarde
        self.__atlyginimas = atlyginimas

    def set_atlyginimas(self, naujas):
        if naujas < 0:
            print("Atlyginimas negali būti neigiamas")
        else:
            self.__atlyginimas = naujas

    def get_atlyginimas(self):
        return self.__atlyginimas

domas = Darbuotojas("Domas", "Rutkauskas", 1200)
print(domas.get_atlyginimas())

# 1200


domas.atlyginimas = 500
print(domas.get_atlyginimas())

# 1200

Python būdas išspręsti geterių/seterių problemą

Dekoratorius @Property:

class Darbuotojas:
    def __init__(self, vardas, pavarde, atlyginimas):
        self.vardas = vardas
        self.pavarde = pavarde
        self.__atlyginimas = atlyginimas

    @property
    def atlyginimas(self):
        return self.__atlyginimas

    @atlyginimas.setter
    def atlyginimas(self, naujas):
        if naujas < 0:
            print("Atlyginimas negali būti neigiamas")
        else:
            self.__atlyginimas = naujas


domas = Darbuotojas("Domas", "Rutkauskas", 1200)
print(domas.atlyginimas)
# 1200

domas.atlyginimas = 1500
print(domas.atlyginimas)
# 1500

domas.atlyginimas = -150
# Atlyginimas negali būti neigiamas

print(domas.atlyginimas)
# 1500