2014-11-28 12 views
6

Sto cercando di capire i metodi di classe. Da quello che ho letto sembra che per i metodi di classe dobbiamo passare cls come primo argomento durante la definizione (simile ai metodi di istanza in cui passiamo il self come primo argomento). Ma vedo che anche se passo il sé come primo argomento per un metodo di classe funziona. Qualcuno può spiegarmi come funziona?Posso passare self come primo argomento per i metodi di classe in python

Ho visto qualche utilizzo in cui hanno definito la classe come un metodo di classe, ma passano ancora come il primo argomento invece di cls. Sto cercando di capire l'utilizzo.

#!/usr/bin/python 


class A(object): 
    def foo(self,x): 
     print "executing foo(%s,%s)"%(self,x) 

    @classmethod 
    def class_foo(self,x): 
     print "executing class_foo(%s,%s)"%(self,x) 


>>> A.class_foo(2) 
executing class_foo(<class '__main__.A'>,2) 
>>> 

risposta

3

mi sento come se l'ultima risposta discuta solo la convenzione di denominazione del primo parametro senza spiegare cosa si valuta per ciò che è noto come metodo statico rispetto a un metodo normale. prendere il seguente esempio:

class A(object): 
    def x(self): 
     print(self) 

    @classmethod 
    def y(self): 
     print(self) 

a = A() 
b = A() 
c = A() 

print(a.x()) 
print(b.x()) 
print(c.x()) 
print() 
print(a.y()) 
print(b.y()) 
print(c.y()) 

l'uscita è il seguente:

<__main__.A object at 0x7fc95c4549d0> 
None 
<__main__.A object at 0x7fc95c454a10> 
None 
<__main__.A object at 0x7fc95c454a50> 
None 
() 
<class '__main__.A'> 
None 
<class '__main__.A'> 
None 
<class '__main__.A'> 
None 

avviso che il metodo x chiamato dai 3 oggetti produce indirizzi hex diverse, il che significa che l'oggetto self è legato all'istanza . il metodo mostra che self fa effettivamente riferimento alla classe stessa piuttosto che all'istanza. questa è la differenza.

+0

A proposito, non è un metodo statico. Un metodo statico è decorato con '@ staticmethod' ed è diverso da un metodo" normale "(che in genere è chiamato metodo di istanza, penso). – Ffisegydd

6

L'uso di self e cls è solo una convenzione di denominazione. Puoi chiamarli come preferisci (no!). Come tale stai ancora passando nell'oggetto classe, lo hai appena chiamato self, anziché cls.

99,999% dei programmatori Python si aspetta di chiamare loro self e cls, anche un sacco di IDE si lamenterà se si chiama loro nulla, ma self e cls, quindi per favore aderire alla convenzione.

+0

Grazie, ha senso. – Pradeep

Problemi correlati