Czy używasz wzorca 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 tego używa.

Dlaczego używasz lub unikasz metod get/set w Pythonie?

7 answers

Fajny link: Python to nie Java :)

W Javie musisz używać getterów i setterów, ponieważ używanie publicznych pól nie daje Ci możliwości powrotu i zmiany zdania na używanie getterów i seterów. Więc w Javie równie dobrze możesz pozbyć się obowiązków 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 klasy. Więc nie pisz getterów i setery.

 51
Author: mgv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-05 17:31:13

W Pythonie możesz uzyskać dostęp do atrybutu bezpośrednio, ponieważ jest on publiczny:

class MyClass(object):

    def __init__(self):
        self.my_attribute = 0  

my_object = MyClass()
my_object.my_attribute = 1 # etc.

Jeśli chcesz zrobić coś na temat dostępu lub mutacji atrybutu, możesz użyć właściwości:

class MyClass(object):

    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 taki sam.

 99
Author: blokeley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-05 18:16:52

Oto co mówi o tym Guido van Rossum w Masterminds of Programming

Co masz na myśli mówiąc "walka z językiem"?

Guido: to zwykle oznacza, że są starając się kontynuować swoje nawyki, które pracował dobrze z innym językiem.

[...] Ludzie zamienią wszystko w klasy, a każdy dostęp zamienia w metoda accessor,
gdzie to naprawdę nie jest mądre, aby zrobić w Pythonie; będziesz miał więcej wyrazistego kodu, który jest
trudniej debugować i działa dużo wolniej. Znasz wyrażenie " możesz pisać FORTRAN w dowolnym języku?"Java można pisać również w dowolnym języku.

 26
Author: Nick Dandoulakis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-05 18:05:19

Nie, to niecytoniczne. Ogólnie przyjętym sposobem jest użycie zwykłego atrybutu danych i zastąpienie tych, które wymagają bardziej złożonej logiki get/set właściwościami.

 13
Author: Max Shawabkeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-05 17:31:27

Krótka odpowiedź na twoje pytanie brzmi nie, powinieneś używać właściwości w razie potrzeby. Ryan Tamyoko zapewnia długą odpowiedź w swoim artykule Getters / Setters / Fuxors

Podstawową wartością jest to, że chcesz starać się upewnić, że każda pojedyncza linia kodu ma jakąś wartość lub znaczenie dla programisty. Języki programowania są dla ludzi, a nie maszyn. Jeśli masz kod, który wygląda, jakby nie robił nic użytecznego, jest trudny do odczytania lub wydaje się żmudny, wtedy są duże szanse, że Python ma jakąś funkcję językową, która pozwoli Ci go usunąć.

 6
Author: Shane C. Mason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-05 18:41:18

Twoja obserwacja jest poprawna. Nie jest to normalny styl programowania w Pythonie. 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 czy instancji). Łatwo powiedzieć, kiedy Programiści Javy uczą się Pythona, ponieważ ich Kod Pythona wygląda jak Java używając składni Pythona!

Zdecydowanie zgadzam się ze wszystkimi poprzednimi plakatami, zwłaszcza linkiem @ Maximiliano do słynnego artykułu i @Max ' s sugestia, że cokolwiek bardziej skomplikowanego niż standardowy sposób ustawiania (i uzyskiwania) atrybutów klas I instancji, polega na użyciu właściwości (lub deskryptorów, aby jeszcze bardziej uogólnić), aby dostosować pobieranie i ustawianie atrybutów! (Obejmuje to możliwość dodawania własnych spersonalizowanych wersji Polityki prywatnej, chronionej, przyjacielskiej lub dowolnej innej, jeśli pragniesz czegoś innego niż Publiczna.)

Jako ciekawe demo, w Programowanie w języku Python (rozdział 13 sekcja 13.16), wymyśliłem przykład użycia deskryptorów do przechowywania atrybutów na dysku zamiast w pamięci!! Tak, to dziwna forma trwałego przechowywania, ale pokazuje przykład tego, co jest możliwe!

Oto kolejny powiązany post, który może również okazać się przydatny: Python: wiele właściwości, jeden setter / getter

 5
Author: wescpy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:53

Nasz nauczyciel pokazał jeden przykład na lekcji wyjaśniający, kiedy powinniśmy używać funkcji accessora.

class Woman(Human):
    def getAge(self):
        if self.age > 30:
            return super().getAge() - 10
        else:
            return super().getAge()
 -9
Author: sjhstone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-05 07:09:22