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?
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?
Odpowiedzi:
Fajny link: Python to nie Java :)
W Javie musisz używać metod pobierających i ustawiających, ponieważ używanie pól publicznych nie daje Ci możliwości powrotu i późniejszej zmiany zdania na używanie metod pobierających i ustawiających. Tak więc w Javie równie dobrze możesz usunąć ten obowiązek z góry. W Pythonie jest to głupie, ponieważ możesz zacząć od normalnego atrybutu i zmienić zdanie w dowolnym momencie, bez wpływu na klientów tej klasy. Więc nie pisz getterów i seterów.
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.
Oto, co Guido van Rossum mówi na ten temat w Masterminds of Programming
Co masz na myśli mówiąc „walka z językiem”?
Guido: Zwykle oznacza to, że starają się kontynuować swoje nawyki, które dobrze działały w innym języku.
[...] Ludzie zamieniają wszystko w klasę i każdy dostęp do metody dostępowej,
podczas gdy w Pythonie nie jest to rozsądne; będziesz mieć bardziej szczegółowy kod, który jest
trudniejszy do debugowania i działa znacznie wolniej. Znasz wyrażenie "FORTRAN można pisać w dowolnym języku?" Możesz napisać Javę w dowolnym języku.
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.
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
Podstawową wartością, którą można z tego wszystkiego wyciągnąć, jest to, że chcesz się upewnić, że każdy wiersz kodu ma jakąś wartość lub znaczenie dla programisty. Języki programowania są przeznaczone dla ludzi, a nie maszyn. Jeśli masz kod, który wygląda na to, że nie robi nic użytecznego, jest trudny do odczytania lub wydaje się nudny, istnieje duże prawdopodobieństwo, że Python ma jakąś funkcję językową, która pozwoli ci go usunąć.
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
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.
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()