Ogólnie jestem zdezorientowany różnicą między „właściwością” a „atrybutem” i nie mogę znaleźć dobrego źródła, aby zwięźle opisać różnice.
146
Właściwości to specjalny rodzaj atrybutów. Zasadniczo, gdy Python napotka następujący kod:
spam = SomeObject()
print(spam.eggs)
wygląda się eggs
w spam
, a następnie sprawdza eggs
, czy to ma __get__
, __set__
albo __delete__
metodę - jeśli to robi, to jest nieruchomość. Jeśli jest to właściwość, zamiast po prostu zwracać eggs
obiekt (tak jak w przypadku każdego innego atrybutu), wywoła __get__
metodę (ponieważ szukaliśmy) i zwróci cokolwiek zwraca ta metoda.
Więcej informacji o modelu danych i deskryptorach Pythona .
Dzięki właściwości masz pełną kontrolę nad jej metodami pobierającymi, ustawiającymi i usuwającymi, których nie masz (jeśli nie używasz zastrzeżeń) z atrybutem.
źródło
x
. Jednokierunkowa. Jeśli użytkownik klasy dowie się o _x, użyje go na własne ryzyko.Ogólnie rzecz biorąc, właściwość i atrybut to to samo. Jednak w Pythonie istnieje dekorator właściwości, który zapewnia pobierający / ustawiający dostęp do atrybutu (lub innych danych).
źródło
Ta właściwość pozwala na pobieranie i ustawianie wartości tak, jak w przypadku zwykłych atrybutów, ale pod spodem znajduje się metoda nazywana tłumaczeniem jej na metodę pobierającą i ustawiającą. To naprawdę tylko wygoda, aby ograniczyć schemat wywoływania metod pobierających i ustawiających.
Powiedzmy na przykład, że masz klasę, która zawierała jakieś współrzędne xiy dla czegoś, czego potrzebujesz. Aby je ustawić, możesz zrobić coś takiego:
O wiele łatwiej jest na to spojrzeć i pomyśleć niż napisać:
Problem w tym, co się stanie, jeśli pewnego dnia twoja klasa zmieni się tak, że będziesz musiał zrównoważyć swoje x i y o jakąś wartość? Teraz musisz wejść i zmienić definicję klasy i cały kod, który ją wywołuje, co może być naprawdę czasochłonne i podatne na błędy. Właściwość pozwala na użycie poprzedniej składni, dając jednocześnie elastyczność zmiany drugiej.
W Pythonie można definiować metody pobierające, ustawiające i usuwające za pomocą funkcji właściwości. Jeśli potrzebujesz tylko właściwości read, istnieje również dekorator @property, który możesz dodać nad metodą.
http://docs.python.org/library/functions.html#property
źródło
Dowiedziałem się 2 różnic ze strony Bernda Kleina, podsumowując:
1. Właściwość jest wygodniejszym sposobem enkapsulacji danych.
np. jeśli masz atrybut public długość Object, później projekt wymaga, abyś go hermetyzował, tj .: zmień go na prywatny i podaj getter i setter => musisz zmienić wiele kodów, które napisałeś wcześniej:
Jeśli używasz @property i @ lenght.setter =>, nie musisz zmieniać tych starych kodów
2. Właściwość może zawierać wiele atrybutów
W tym przykładzie
__physic_health
i__mental_health
są prywatne i nie można uzyskać do nich dostępu bezpośrednio z zewnątrz, jedynym sposobem interakcji z nimi poza klasą jest poprzez właściwośćcondition
źródło
Jest też jedna nieoczywista różnica, której używam do buforowania lub odświeżania danych, często mamy funkcję połączoną z atrybutem klasy. Na przykład muszę raz przeczytać plik i zachować zawartość przypisaną do atrybutu, aby wartość była buforowana:
Wynik:
Uzyskaliśmy dostęp do atrybutu dwukrotnie, ale nasza funkcja została uruchomiona tylko raz. Zmiana powyższego przykładu na użycie właściwości spowoduje odświeżenie wartości atrybutu przy każdym dostępie do niego:
Wynik:
źródło