2009-03-28 11 views

risposta

25

Se si è tentati di chiamare un metodo di classe da un'istanza, probabilmente non è necessario un metodo di classe.

Nell'esempio fornito un metodo statico sarebbe più appropriato proprio a causa dell'ultima annotazione (nessuna interazione self/cls).

class C(object): 
    @staticmethod 
    def f(x): 
     return x + x 

questo modo è "buona forma" per fare entrambe le cose

c = C() 
c.f(2) 

e

C.f(2) 
+0

Sì, ma se davvero hai bisogno di un metodo di classe? – frnhr

4

Si tratta principalmente di uno sguardo confuso. Se stavo usando la tua classe e ho visto questo, mi chiedevo quali altre sorprese ci fossero, sembra solo un cattivo design.

C'è un motivo per cui non è solo un metodo statico?

2

C.f() è più chiaro di c_instance.f() e c_instance.__class__.f() è solo brutto. Dato che la chiarezza e la bellezza sono caratteristiche caramente amate nella comunità python, tenderei a dire che C.f() è la via migliore.

C'è qualche motivo particolare per cui vuoi chiamarlo in uno degli altri modi?

+4

Il nome della classe (in questo caso 'C') potrebbe cambiare però ... –

3

Se hai già un'istanza di C, perché hai bisogno di f() per essere un metodo di classe? Non solo è una cattiva forma, di solito non è necessaria. Qualcuno in rete dice: "Questo è male perché crea l'impressione che vengano utilizzate alcune variabili di istanza nell'oggetto, ma non è questo il caso."

Anche se, a pagina 484 di learning python note che si può chiamare il metodo in entrambi i casi e sarà esattamente lo stesso fino a quando si passa la stessa istanza in.

+4

Non hai bisogno di classmethod-on-instance per il codice di esempio dato, ma se avvii la sottoclasse di C, potresti. – bobince

9

non ricordo utilizzando un classmethod come questo dall'esterno della classe, ma è certamente ok per un metodo di istanza chiamare un classmethod su se stesso (es. self.foo() dove foo è un metodo di classe). Ciò garantisce che l'ereditarietà funzioni come previsto e chiamerà .foo() nella sottoclasse destra anziché nella classe base.

Problemi correlati