Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 0
  • 1

Czemu w metodzie __get__ jest argument type, a w __set__ i __delete__ go nie ma?

Z jakiego powodu type jest tylko w __get__?

descr.__get__(self, obj, type=None) --> value


descr.__set__(self, obj, value) --> None


descr.__delete__(self, obj) --> None

Logiczne byłoby, żeby był we wszystkich trzech metodach lub żadnej. Jakie ma uzasadnienie?

Mateus_Kopeć
  • Zapytał
  • @ Mateus_Kopeć | 19.09.2017
    • 0
    • 0
    • 0

Odpowiedź (1)

  • 0

Przede wszystkim, nazwa argumentu type dla funkcji descr.__get__ jest troszkę myląca, aczkolwiek nadal prawdziwa.

Jak słusznie wkleiłeś z dokumentacji:

https://docs.python.org/3/howto/descriptor.html

Rzeczywiście interface metody __get__ posiada argument type. Natomiast jeżeli spojrzymy na tą stronę dokumentacji:

https://docs.python.org/3/reference/datamodel.html#object.__get__

Zauważymy, że nazwa type została zastąpiona przez mniej mylącą nazwę owner (object.__get__(self, instance, owner)) i tak została opisana w dokumentacji:

Called to get the attribute of the owner class (class attribute access) or of an instance of that class (instance attribute access). owner is always the owner class, while instance is the instance that the attribute was accessed through, or None when the attribute is accessed through the owner. This method should return the (computed) attribute value or raise an AttributeError exception.

Oczywiście owner to type, a type to owner (różnica tylko w nazwie). Następuje w dokumentacji zmiana nazewnictwa na owner, ale jeszcze nie jest ona wszędzie przeprowadzona co powoduje niepotrzebną komplikację.

Zgodnie jednak z opisem z dokumentacji, metoda __get__ może działać zarówno na instancji klasy, jak i na klasie samej w sobie. W tym drugim przypadku instance przyjmuje wartość None (stąd w zadaniu należało badać czy argument obj jest None). Takie zachowanie nie jest potrzebne dla pozostałych dwóch operacji, ponieważ dane nie będą zaciągane z obiektu/klasy, a jedynie przypisane, a zatem dotyczą oczywiście zawsze instancji, więc type byłby tutaj nadmiarowy. Jeżeli chciałbyś przypisać w __set__ coś do atrybutu klasy (a nie instancji), musiałbyś tego dokonać na poziomie metaklasy.

Pozdrawiam.
Bartosz Skowron.

  • Odpowiedział
  • @ | 19.09.2017
  • TRENER ALTKOM AKADEMII