Ich lese ein wenig auf Python-Objekt-Attribut-Lookup (hier: https://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/#object-attribute-lookup).Python 3 __getattribute__ vs dot Zugriffsverhalten
scheint ziemlich geradlinig, so dass ich es ausprobiert (python3):
class A:
def __getattr__(self, attr):
return (1,2,3)
a = A()
a.foobar #returns (1,2,3) as expected
a.__getattribute__('foobar') # raises AttributeError
ist meine Frage nicht die beiden identisch Dibe soll?
Warum löst der zweite einen Attributfehler aus?
So ist die Antwort offensichtlich, dass die Logik für a.foobar
unterscheidet sich von der Logik für a.__getattribute("foobar")
. Nach den data model: a.foobar
a.__getattribute("foobar")
nennt, und wenn es ein Attribut wirft, nennt es a.-__getattr__('foobar')
So ist es der Artikel scheint einen Fehler in ihrem Diagramm hat. Ist das richtig?
Und noch eine Frage: Wo sitzt die wahre Logik für a.foobar? Ich dachte, es war in __getattribute__
, aber anscheinend nicht vollständig.
Edit: kein Duplikat
Difference between __getattr__ vs __getattribute__. Ich frage hier, was ist der Unterschied zwischen object.foo
und object.__getattribute__("foo")
. Dies unterscheidet sich von __getattr__
vs __getatribute__
, was trivial ist ...
Zuerst auf das offizielle Dokument verweisen: https://docs.python.org/3.5/reference/datamodel.html#object.__getattribute__ – thodnev
Ändern Sie ein .__ getattribute __ ('foobar') 'in ein .__ getattr __ ('foobar ') 'und sehen, was passiert. – DeepSpace
Nicht daran interessiert ... '__getattribute__' soll schließlich' _getattr__' heißen. 'a.foobar' soll" __getattribute__ "aufrufen – deller