Sens getterów i setterów

0

Jaki jest sens stosowania getterów i setterów w Pythonie? Np. w Javie jak mam gettera i settera to nie mogę później wprost przypisać albo odczytać jakiegoś pola klasy, jest to możliwe tylko przez settera i gettera. A w Pythonie czy mam gettery i settery, czy nie mam getterów i setterów to nic to nie zmienia. Ktoś może mi to wytłumaczyć?

class Human():
	counter = 0

	@staticmethod
	def status():
		print "Total amount of humans: %s" % Human.counter

	def __init__(self, name):
		self.__name = name
		Human.counter += 1

	@property
	def name(self):
		return self.__name

	@name.setter
	def name(self, new_name):
		self.__name = new_name	

a = Human("Jack")		
a.name = "George" #dziala, a powinno dzialac tylko a.name("George")
Human.status()
print a.name #dziala, a powinno dzialac tylko a.name()
0

A czy sens używania getterów i setterów (nawet w Javie) jest tylko taki, żeby nie móc używać zmiennej normalnie (tzn. bezpośrednio)? Nie ma innych powodów? Czy dalsza możliwość bezpośredniego ustawiania zmiennych przekreśla sens używania getterów i setterów? Gdyby w Javie jednak dało się od nowej wersji nadal ustawiać zmienne bezpośrednio to gettery i settery są do wywalenia? Zastanów się nad tym, a poniżej masz odpowiedź:
http://www.python-course.eu/python3_properties.php

W skrócie: nadal gettery i settery mogą wykonywać milion rzeczy podczas pobierania i ustawiania zmiennych oraz bezpośrednie odczytywanie/przypisywanie może wywoływać właśnie gettery i settery odpowiednio.

0

A co z walidacją danych?
Zrób sobie klasę Fraction, z publicznymi polami Nominator i Denominator. Masz dostęp bezpośredni, ok. A teraz daj to użyszkodnikowi, który wstawi zero do mianownika. I dupa, leci error divison by zero i koniec. A tutaj możesz zrobić walidację, albo rzucić własny wyjątek, albo obsłużyć domyślnie rzucany (jeśli taki jest). Rozwiązań bez liku, ale wymagają kontroli tego co jest wpisywane (czyli nieszczęsnego settera zdefiniowanego przez programistę).

1 użytkowników online, w tym zalogowanych: 0, gości: 1