Ho uno sfondo in Python (anche se completamente autodidatta, quindi potrei avere alcune cattive abitudini o idee sbagliate) e sto cercando di imparare Ruby per ampliare il mio ambito.Metaprogramming in Python - aggiunta di un metodo oggetto
Stavo leggendo alcuni confronti, e ho visto molte asserzioni che "Python non può fare metaprogrammazione" (o, meno infiammatoriamente, "Python non può fare metaprogrammazione così semplicemente come Ruby"). Così sono andato via e ho letto velocemente sulla metaprogrammazione, e ho avuto l'impressione che, in pratica, modifichi i metodi/comportamenti delle classi/oggetti durante il runtime (per favore correggimi se sono errato!).
Ho avuto l'impressione che, dal momento che Python è dinamico, non dovrebbe essere un problema. Tuttavia, ho eseguito il seguente codice di prova, che non ha dato la risposta che aspettavo:
>>> class foo:
... def make_hello_method(self):
... def hello(obj):
... print 'hello'
... self.hello = hello
...
>>> f = foo()
>>> f.hello()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: foo instance has no attribute 'hello'
>>> f.make_hello_method()
>>> f.hello()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: hello() takes exactly 1 argument (0 given)
ero sotto l'impressione che ogni metodo di un oggetto è stato passato automaticamente l'oggetto stesso come primo argomento (da cui il requisiti costanti per definire i metodi dell'oggetto come (self, [...])
). Come mai f
non viene passato a hello()
?
duplicati di http://stackoverflow.com/questions/972/ aggiunta-un-metodo-a-un-oggetto-esistente – spinlok