Come si può rendere statico un metodo di classe dopo che la classe è stata definita? In altre parole, perché il terzo caso fallisce?Creare un metodo statico da un metodo esistente al di fuori della classe? (errore "metodo non associato")
>>> class b: ... @staticmethod ... def foo(): ... pass ... >>> b.foo() >>> class c: ... def foo(): ... pass ... foo = staticmethod(foo) ... >>> c.foo() >>> class d: ... def foo(): ... pass ... >>> d.foo = staticmethod(d.foo) >>> d.foo() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unbound method foo() must be called with d instance as first argument (got nothing instead)
Non dovrebbe essere 'd.foo.im_func'? –
Sì, grazie. Fisso! – kindall
Bene, è necessario contrassegnarli con 'staticmethod' per chiamarli in modo equivalente su istanze, non solo sulla classe stessa. 'd.foo()' funziona con o senza il wrapping 'staticmethod', ma' d(). foo() 'esploderebbe (proverebbe a passare' self' che 'foo' non accetta). Certo, non esiste alcuna funzionalità relativa all'istanza che richiederebbe di chiamarli su un'istanza, ma per DRY, i metodi che fanno riferimento al metodo statico possono e dovrebbero chiamarlo 'self.foo()' invece di nominare esplicitamente la classe. – ShadowRanger