Sens getterów i setterów

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ć?

Kopiuj
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()
TU
  • Rejestracja:około 19 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Lublin
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.

xfin
  • Rejestracja:ponad 11 lat
  • Ostatnio:9 miesięcy
  • Lokalizacja:Genewa
  • Postów:597
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ę).

bogdans
Problem autora jest chyba inny: po co setter skoro i tak istnieje bezpośredni dostęp do pola prywatnego. Zatem użyszkodnik i tak może przypisać 0 do Denominatora.
xfin
@bogdans tak o tym nie pomyślałem :) Niemniej nawet PEP dla pythona wprowadze pewne półśrodki w celu eliminacji takich kwiatków. Np. __zmienna ma utrudniać dostępy do pól. Niemniej to nadal półśrodek, a nie racjonalne rozwiązanie.
TU
W linku, który podałem jest jak przekierować bezpośredni dostęp na gettery i settery (niby ktoś używa bezpośrednio, a i tak wykonuje się walidacja). A jeśli chodzi o to czy autor pytał po co settery i gettery jak jest nadal bezpośredni pomysł to odpowiedź @xfin jest poprawna. Bardziej stosowne pytanie powinno być: po co bezpośredni dostęp skoro są gettery i settery (czyli w drugą stronę).
bogdans
W Pythonie 2.7 przekierowanie na gettery(settery) nie działa. Użyłem celowo słowa chyba, przypuszczam, że autor o co innego spytał, a co innego go dręczy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.