__setattribute__
existiert nicht, weil __setattr__
immer genannt wird. __getattr__
wird nur für f.x
aufgerufen, wenn die Attributsuche über den normalen Kanal fehlschlägt (der von __getattribute__
bereitgestellt wird, so dass die Funktion in ähnlicher Weise immer aufgerufen wird).
Das Deskriptorprotokoll ist leicht orthogonal zu den anderen.Angesichts
class Foo(object):
def __init__(self):
self.x = 5
f = Foo()
folgenden Bedingungen erfüllt sind:
f.x
f.__getattribute__('x')
aufrufen würde, wenn sie definiert wurden.
f.x
würde f.__getattr__('x')
nicht aufrufen, wenn es definiert wäre.
f.y
würde f.__getattr__('y')
berufen, wenn sie definiert wurden, oder auch f.__getattribute__('y')
wenn es definiert wurden.
Der Deskriptor aufgerufen wird durch ein Attribut, anstatt für ein Attribut. Das heißt:
class MyDescriptor(object):
def __get__(...):
pass
def __set__(...):
pass
class Foo(object):
x = MyDescriptor()
f = Foo()
Nun f.x
verursachen würde type(f).__dict__['x'].__get__
genannt zu werden, und f.x = 3
würde type(f).__dict__['x'].__set__(3)
nennen.
Das heißt, Foo.__getattr__
und Foo.__getattribute__
würde verwendet werden, um herauszufinden, was f.x
Referenzen; Sobald Sie das haben, f.x
erzeugt das Ergebnis type(f.x).__get__()
wenn definiert, und f.x = y
ruft f.x.__set__(y)
auf, wenn definiert.
(Die oben genannten Anrufe __get__
und __set__
sind nur annähernd richtig, da ich die Details, welche Argumente __get__
links und __set__
tatsächlich erhalten, aber dies soll den Unterschied zwischen __get__
und __getattr[ibute]__
. Genug sein, um zu erklären)
Setzen Sie noch einen anderen Weg, wenn MyDescriptor
nicht definieren, dann f.x
würde einfach die Instanz MyDescriptor
zurückgeben.
Zum Close-Voter: IMX, Lernerfragen wie "Wie entscheide ich mich zwischen X und Y?" oder "Was ist der Unterschied zwischen X und Y?" sind wirklich zwei Fragen - "Was ist der beabsichtigte Zweck von X?" und "Was ist der beabsichtigte Zweck von Y?" Vielleicht wäre es besser, sie getrennt zu fragen, aber im aktuellen Fall ist auch keine "zu weite" IMO, und es besteht zumindest eine gewisse Verbindung zwischen den verschiedenen magischen Methoden. –