Disclaimer Dies ist nur eine Übung in Meta-Programmierung, es hat keine praktische Zweck.Die Definition von __getattr__ und __getitem__ für eine Funktion hat keine Auswirkungen
ich zugewiesen habe __getitem__
und __getattr__
Methoden auf einem Funktionsobjekt, aber es keine Wirkung ...
def foo():
print "foo!"
foo.__getitem__ = lambda name: name
foo.__getattr__ = lambda name: name
foo.baz = 'baz'
Sanity prüfen, ob wir können Eigenschaften zuweisen zu einer Funktion:
>>> foo.baz
'baz'
Ordentlich. Wie wäre es mit den "Magischen Gettern"?
>>> foo.bar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'bar'
>>> foo['foo']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'function' object is not subscriptable
>>> getattr(foo, 'bar')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'bar'
Ist es möglich, ein "Magic Getter" auf einem Funktionsobjekt zu haben?
@kindall weist darauf hin, aber ich werde es hier erwähnen, so bleibt es bei der Antwort. New-Style-Klassen verwenden nicht die "normale" Methodenauflösung mit '__getattr__' und seinen Freunden. 'a.foo' wird intern in' type (a) .__ getattr __ ('foo') 'übersetzt. Daher wird die Eigenschaft '__getattr__', die in' a .__ dict__' gespeichert ist, nicht gefunden. Hoffe das macht Sinn ...: -/ – colinta