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__?

Author: Zearin, 2012-01-28

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:

__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.

 40
Author: Rik Poggi,
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