__setattribute__
non esiste perché __setattr__
è sempre chiamato. __getattr__
viene chiamato solo per f.x
se la ricerca dell'attributo non riesce tramite il canale normale (che è fornito da __getattribute__
, in modo che la funzione venga chiamata sempre allo stesso modo).
Il protocollo descrittore è leggermente ortogonale rispetto agli altri.Dato
class Foo(object):
def __init__(self):
self.x = 5
f = Foo()
le seguenti condizioni:
f.x
sarebbe invocare f.__getattribute__('x')
se fosse definito.
f.x
non invoca f.__getattr__('x')
se è stato definito.
f.y
sarebbe invocare f.__getattr__('y')
se sono stati definiti, oppure f.__getattribute__('y')
se si sono stati definiti.
Il descrittore viene richiamato da un attributo, piuttosto che per un attributo. Cioè:
class MyDescriptor(object):
def __get__(...):
pass
def __set__(...):
pass
class Foo(object):
x = MyDescriptor()
f = Foo()
Ora, f.x
causerebbe type(f).__dict__['x'].__get__
di essere chiamato, e f.x = 3
chiamerebbe type(f).__dict__['x'].__set__(3)
.
Cioè, Foo.__getattr__
e Foo.__getattribute__
sarebbero stati utilizzati per trovare ciò f.x
riferimenti; una volta ottenuto ciò, f.x
produce il risultato di type(f.x).__get__()
se definito, e f.x = y
invoca f.x.__set__(y)
se definito.
(Le chiamate di cui sopra a __get__
e __set__
sono solo approssimativamente corretta, dal momento che ho lasciato fuori i dettagli di quali argomenti __get__
e __set__
effettivamente ricevere, ma questo dovrebbe essere sufficiente per spiegare la differenza tra __get__
e __getattr[ibute]__
.)
Metti un altro modo, se MyDescriptor
non ha definito __get__
, quindi f.x
restituirebbe semplicemente l'istanza di MyDescriptor
.
Al close-voter: IMX, domande dello studente come "come faccio a decidere tra X e Y?" o "qual è la differenza tra X e Y?" sono davvero due domande - "qual è lo scopo di X?" e "qual è lo scopo di Y?" Forse sarebbe meglio chiedere loro separatamente, ma nessuno dei due è, nella fattispecie, un IMO "troppo ampio", e vi è almeno * qualche * collegamento tra i diversi metodi magici qui. –