Disclaimer Questo è solo un esercizio di meta-programmazione, non ha uno scopo pratico .La definizione di __getattr__ e __getitem__ su una funzione non ha effetto
Ho assegnato __getitem__
e __getattr__
metodi su un oggetto funzione, ma v'è alcun effetto ...
def foo():
print "foo!"
foo.__getitem__ = lambda name: name
foo.__getattr__ = lambda name: name
foo.baz = 'baz'
test di integrità che siamo in grado di assegnare proprietà a una funzione:
>>> foo.baz
'baz'
Neat. Che ne dici dei "getter magici"?
>>> 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'
È possibile avere un "getter magico" su un oggetto funzione?
@kindall lo sottolinea qui di seguito, ma lo menzionerò qui in modo che rimanga con la risposta. le classi di nuovo stile non usano la risoluzione del metodo "normale" con '__getattr__' e i suoi amici. 'a.foo' è tradotto internamente in' type (a) .__ getattr __ ('foo') '. Quindi la proprietà '__getattr__' che è memorizzata in' a .__ dict__' non è stata trovata. Spero che abbia senso ...: -/ – colinta