Jakie są różnice pomiędzy metodami "get*" I "del*" Pythona?
Zacząłem uczyć się Pythona kilka miesięcy temu i staram się zrozumieć różnice między różnymi metodami __get*__
:
__get__
__getattr__
__getattribute__
__getitem___
I ich __del*__
odpowiedniki:
__del__
__delattr__
__delete__
__delitem__
Jakie są różnice między nimi? Kiedy powinienem używać jednego nad drugim? Czy istnieje konkretny powód, dla którego większość metod __get*__
ma odpowiedniki __set*__
, ale nie ma __setattribute__
?
1 answers
Dokumentacja każdej wymienionej metody jest łatwo dostępna z indeksu dokumentacji .
W każdym razie może to być trochę rozszerzone odniesienie:
__get__
, __set__
i __del__
są deskryptorami
"W skrócie, deskryptor jest sposobem na dostosowanie tego, co się dzieje, gdy odwołujesz się do atrybutu w modelu." [oficjalny link doc]
Są dobrze wyjaśnione, więc tutaj są pewne referencje:
- deskryptory Pythona Marty Alchin Część 1 i część 2
- więc pytanie zrozumienie _ _ get _ _ I _ _ set _ _ I deskryptorów Pythona
__getattr__
, __getattribute__
, __setattr__
, __delattr__
Są metodami, które mogą być zdefiniowane w celu dostosowania znaczenia dostępu do atrybutów (używania, przypisywania lub usuwania x.name
) dla instancji klasy. [official doc link]
Przykład 1:
class Foo:
def __init__(self):
self.x = 10
def __getattr__(self, name):
return name
f = Foo()
f.x # -> 10
f.bar # -> 'bar'
Przykład 2:
class Foo:
def __init__(self):
self.x = 10
def __getattr__(self,name):
return name
def __getattribute__(self, name):
if name == 'bar':
raise AttributeError
return 'getattribute'
f = Foo()
f.x # -> 'getattribute'
f.baz # -> 'getattribute'
f.bar # -> 'bar'
__getitem__
, __setitem__
, __delitem__
Są metodami, które można zdefiniować do implementacji obiektów kontenera. [oficjalny link doc]
Przykład:
class MyColors:
def __init__(self):
self._colors = {'yellow': 1, 'red': 2, 'blue': 3}
def __getitem__(self, name):
return self._colors.get(name, 100)
colors = MyColors()
colors['yellow'] # -> 1
colors['brown'] # -> 100
Mam nadzieję, że to wystarczy, aby dać ci ogólne pojęcie.
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 10:31:22