Używanie get / set wydaje się być powszechną praktyką w Javie (z różnych powodów), ale prawie nie widzę kodu Pythona, który to używa.
Dlaczego używasz lub unikasz metod get / set w Pythonie?
python
getter-setter
Roger Pate
źródło
źródło
Odpowiedzi:
Fajny link: Python to nie Java :)
źródło
W Pythonie możesz po prostu uzyskać bezpośredni dostęp do atrybutu, ponieważ jest on publiczny:
class MyClass: def __init__(self): self.my_attribute = 0 my_object = MyClass() my_object.my_attribute = 1 # etc.
Jeśli chcesz coś zrobić z dostępem lub mutacją atrybutu, możesz użyć właściwości :
class MyClass: def __init__(self): self._my_attribute = 0 @property def my_attribute(self): # Do something if you want return self._my_attribute @my_attribute.setter def my_attribute(self, value): # Do something if you want self._my_attribute = value
Co najważniejsze, kod klienta pozostaje ten sam.
źródło
Oto, co Guido van Rossum mówi na ten temat w Masterminds of Programming
źródło
Nie, to nie jest szpiegowskie. Powszechnie akceptowanym sposobem jest użycie normalnego atrybutu danych i zastąpienie tych, które wymagają bardziej złożonej logiki pobierania / ustawiania, właściwościami.
źródło
Krótka odpowiedź na twoje pytanie brzmi: nie, w razie potrzeby powinieneś używać właściwości. Ryan Tamyoko udziela długiej odpowiedzi w swoim artykule Getters / Setters / Fuxors
źródło
Twoja obserwacja jest poprawna. To nie jest normalny styl programowania w Pythonie. Wszystkie atrybuty są publiczne, więc po prostu uzyskujesz do nich dostęp (pobierasz, ustawiasz, usuwasz) tak, jak w przypadku atrybutów dowolnego obiektu, który je posiada (nie tylko klas lub instancji). Łatwo jest stwierdzić, kiedy programiści Javy uczą się języka Python, ponieważ ich kod w języku Python wygląda jak Java przy użyciu składni Pythona!
Zdecydowanie zgadzam się ze wszystkimi poprzednimi plakatami, zwłaszcza linkiem @ Maximiliano do słynnego artykułu Phillipa i sugestią @ Maxa, że czymś bardziej złożonym niż standardowy sposób ustawiania (i uzyskiwania) atrybutów klas i instancji jest użycie właściwości (lub deskryptorów, aby jeszcze bardziej uogólnić) aby dostosować pobieranie i ustawienie atrybutów! (Obejmuje to możliwość dodawania własnych, dostosowanych wersji zasad prywatnych, chronionych, znajomych lub dowolnej innej, jeśli chcesz, aby coś innego niż publiczne).
Jako interesujące demo, w Core Python Programming (rozdział 13, sekcja 13.16), przedstawiłem przykład użycia deskryptorów do przechowywania atrybutów na dysku zamiast w pamięci !! Tak, to dziwne formy pamięci trwałej, ale nie pokazać wam przykład tego, co jest możliwe!
Oto kolejny pokrewny post, który również może Ci się przydać: Python: wiele właściwości, jeden ustawiający / pobierający
źródło
Przyszedłem tutaj po tę odpowiedź (niestety nie mogłem). Ale znalazłem pracę gdzie indziej. Poniższy kod może być alternatywą dla get .
class get_var_lis: def __init__(self): pass def __call__(self): return [2,3,4] def __iter__(self): return iter([2,3,4]) some_other_var = get_var_lis
To tylko obejście . Korzystając z powyższej koncepcji, możesz łatwo zbudować metodologię get / set również w py.
źródło
Nasz nauczyciel pokazał jeden przykład w klasie, wyjaśniając, kiedy powinniśmy używać funkcji pomocniczych.
class Woman(Human): def getAge(self): if self.age > 30: return super().getAge() - 10 else: return super().getAge()
źródło