æ®éæ¹æ³ï¼éææ¹æ³åç±»æ¹æ³
è¿ä¸ªçæ¡çåææ¯Difference between @staticmethod and @classmethod in Python
è¿éçå
容æ¯æéç¥åä½è
并å¾å°å
许çæ
åµä¸çç¿»è¯ç¨¿
è¿ä¸ªæ¯æçå客æç« çå°åpyhtonéææ¹æ³åç±»æ¹æ³
ç±»ä¸æ常ç¨çæ¹æ³æ¯å®ä¾æ¹æ³, å³éè¿éè¿å®ä¾ä½ä¸ºç¬¬ä¸ä¸ªåæ°çæ¹æ³ã
举个ä¾åï¼ä¸ä¸ªåºæ¬çå®ä¾æ¹æ³å°±åä¸é¢è¿ä¸ª:
class Kls(object):
def __init__(self, data):
self.data = data
def printd(self):
print(self.data)
ik1 = Kls('arun')
ik2 = Kls('seema')
ik1.printd()
ik2.printd()
è¿ä¼ç»åºå¦ä¸çè¾åº:
arun
seema
ç¶åçä¸ä¸ä»£ç å示ä¾å¾ç:
1ï¼2åæ°ä¼ éç»æ¹æ³.
3 selfåæ°æåå½åå®ä¾èªèº«.
4 æ们ä¸éè¦ä¼ éå®ä¾èªèº«ç»æ¹æ³ï¼Python解éå¨èªå·±ä¼åè¿äºæä½ç.
å¦æç°å¨æ们æ³åä¸äºä»
ä»
ä¸ç±»äº¤äºèä¸æ¯åå®ä¾äº¤äºçæ¹æ³ä¼æä¹æ ·å¢? æ们å¯ä»¥å¨ç±»å¤é¢åä¸ä¸ªç®åçæ¹æ³æ¥åè¿äºï¼ä½æ¯è¿æ ·åå°±æ©æ£äºç±»ä»£ç çå
³ç³»å°ç±»å®ä¹çå¤é¢. å¦æåä¸é¢è¿æ ·åå°±ä¼å¯¼è´ä»¥å代ç ç»´æ¤çå°é¾:
def get_no_of_instances(cls_obj):
return cls_obj.no_inst
class Kls(object):
no_inst = 0
def __init__(self):
Kls.no_inst = Kls.no_inst + 1
ik1 = Kls()
ik2 = Kls()
print(get_no_of_instances(Kls))
è¾åº:
2
@classmethod
æ们è¦åä¸ä¸ªåªå¨ç±»ä¸è¿è¡èä¸å¨å®ä¾ä¸è¿è¡çæ¹æ³. å¦ææ们æ³è®©æ¹æ³ä¸å¨å®ä¾ä¸è¿è¡ï¼å¯ä»¥è¿ä¹å:
def iget_no_of_instance(ins_obj):
return ins_obj.__class__.no_inst
class Kls(object):
no_inst = 0
def __init__(self):
Kls.no_inst = Kls.no_inst + 1
ik1 = Kls()
ik2 = Kls()
print iget_no_of_instance(ik1)
è¾åº
2
å¨Python2.2以åå¯ä»¥ä½¿ç¨@classmethodè£
饰å¨æ¥å建类æ¹æ³.
class Kls(object):
no_inst = 0
def __init__(self):
Kls.no_inst = Kls.no_inst + 1
@classmethod
def get_no_of_instance(cls_obj):
return cls_obj.no_inst
ik1 = Kls()
ik2 = Kls()
print ik1.get_no_of_instance()
print Kls.get_no_of_instance()
è¾åº:
2
2
è¿æ ·ç好å¤æ¯: ä¸ç®¡è¿ä¸ªæ¹å¼æ¯ä»å®ä¾è°ç¨è¿æ¯ä»ç±»è°ç¨ï¼å®é½ç¨ç¬¬ä¸ä¸ªåæ°æç±»ä¼ éè¿æ¥.
@staticmethod
ç»å¸¸æä¸äºè·ç±»æå
³ç³»çåè½ä½å¨è¿è¡æ¶åä¸éè¦å®ä¾åç±»åä¸çæ
åµä¸éè¦ç¨å°éææ¹æ³. æ¯å¦æ´æ¹ç¯å¢åéæè
ä¿®æ¹å
¶ä»ç±»çå±æ§çè½ç¨å°éææ¹æ³. è¿ç§æ
åµå¯ä»¥ç´æ¥ç¨å½æ°è§£å³, ä½è¿æ ·åæ ·ä¼æ©æ£ç±»å
é¨ç代ç ï¼é æç»´æ¤å°é¾.
æ¯å¦è¿æ ·:
IND = 'ON'
def checkind():
return (IND == 'ON')
class Kls(object):
def __init__(self,data):
self.data = data
def do_reset(self):
if checkind():
print('Reset done for:', self.data)
def set_db(self):
if checkind():
self.db = 'new db connection'
print('DB connection made for:',self.data)
ik1 = Kls(12)
ik1.do_reset()
ik1.set_db()
è¾åº:
Reset done for: 12
DB connection made for: 12
å¦æ使ç¨@staticmethodå°±è½æç¸å
³ç代ç æ¾å°å¯¹åºçä½ç½®äº.
IND = 'ON'
class Kls(object):
def __init__(self, data):
self.data = data
@staticmethod
def checkind():
return (IND == 'ON')
def do_reset(self):
if self.checkind():
print('Reset done for:', self.data)
def set_db(self):
if self.checkind():
self.db = 'New db connection'
print('DB connection made for: ', self.data)
ik1 = Kls(12)
ik1.do_reset()
ik1.set_db()
è¾åº:
Reset done for: 12
DB connection made for: 12
ä¸é¢è¿ä¸ªæ´å
¨é¢ç代ç åå¾ç¤ºæ¥å±ç¤ºè¿ä¸¤ç§æ¹æ³çä¸å
@staticmethod å @classmethodçä¸å
class Kls(object):
def __init__(self, data):
self.data = data
def printd(self):
print(self.data)
@staticmethod
def smethod(*arg):
print('Static:', arg)
@classmethod
def cmethod(*arg):
print('Class:', arg)
>>> ik = Kls(23)
>>> ik.printd()
23
>>> ik.smethod()
Static: ()
>>> ik.cmethod()
Class: (<class '__main__.Kls'>,)
>>> Kls.printd()
TypeError: unbound method printd() must be called with Kls instance as first argument (got nothing instead)
>>> Kls.smethod()
Static: ()
>>> Kls.cmethod()
Class: (<class '__main__.Kls'>,)
ä¸é¢è¿ä¸ªå¾è§£éäºä»¥ä¸ä»£ç æ¯æä¹è¿è¡ç:
http://www.zhihu.com/question/20021164