>æä»¥ï¼èªå·±ä»¥ä¸ºç«å¾ç¨³çï¼é¡»è¦è°¨æ
ï¼å
å¾è·åãä½ ä»¬æéè§çè¯æ¢ï¼æ éæ¯äººæè½åçãç¥æ¯ä¿¡å®çï¼å¿
ä¸å«ä½ 们åè¯æ¢è¿äºæè½åçãå¨åè¯æ¢çæ¶åï¼æ»è¦ç»ä½ 们å¼ä¸æ¡åºè·¯ï¼å«ä½ 们è½å¿åå¾ä½ã(1 CORINTHIANS 10:12-13)
#ç±»(5)
å¨åé¢å èè®¨è®ºç±»çæ¶åï¼ç»å¸¸è¦å°ç±»å®ä¾åï¼ç¶åéè¿å®ä¾æ¥è°ç¨ç±»çæ¹æ³ï¼å½æ°ï¼ã卿¤ï¼æåé¢ç»å¸¸åçè¿ç±»äºæ
æ¦æ¬ä¸ä¸ï¼
- æ¹æ³æ¯ç±»å
é¨å®ä¹å½æ°ï¼åªä¸è¿è¿ä¸ªå½æ°ç第ä¸ä¸ªåæ°æ¯selfãï¼å¯ä»¥è®¤ä¸ºæ¹æ³æ¯ç±»å±æ§ï¼ä½ä¸æ¯å®ä¾å±æ§ï¼
- å¿
é¡»å°ç±»å®ä¾åä¹åï¼æè½éè¿å®ä¾è°ç¨è¯¥ç±»çæ¹æ³ãè°ç¨çæ¶å卿¹æ³åé¢è¦è·æ¬å·ï¼æ¬å·ä¸é»è®¤æselfåæ°ï¼ä½æ¯ä¸ååºæ¥ãï¼
éè¿å®ä¾è°ç¨æ¹æ³ï¼å¨å颿¾ç¨äºä¸ä¸ªä¸ä¸¥è°¨çè¯è¯ï¼å®ä¾æ¹æ³ï¼ï¼æä»¬ç§°è¿ä¸ªæ¹æ³**ç»å®**å¨å®ä¾ä¸ã
##è°ç¨ç»å®æ¹æ³
åé¢ä¸ç´å¨è¿æ ·åãæ¯å¦ï¼
class Person(object):
def foo(self):
pass
妿è¦è°ç¨Person.foo()æ¹æ³ï¼å¿
é¡»ï¼
pp = Person() #å®ä¾å
pp.foo()
è¿æ ·å°±å®ç°äºæ¹æ³åå®ä¾çç»å®ï¼äºæ¯éè¿`pp.foo()`å³å¯è°ç¨è¯¥æ¹æ³ã
##è°ç¨éç»å®æ¹æ³
å¨[ãç±»(4)ã](./209.md)ä¸ï¼ä»ç»äºä¸ä¸ªå½æ°superãä¸ºäºæè¿°æ¹ä¾¿ï¼æä»£ç å¤å¶è¿æ¥ï¼
#!/usr/bin/env python
# coding=utf-8
__metaclass__ = type
class Person:
def __init__(self):
self.height = 160
def about(self, name):
print "{} is about {}".format(name, self.height)
class Girl(Person):
def __init__(self):
super(Girl, self).__init__()
self.breast = 90
def about(self, name):
print "{} is a hot girl, she is about {}, and her breast is {}".format(name, self.height, self.breast)
super(Girl, self).about(name)
if __name__ == "__main__":
cang = Girl()
cang.about("canglaoshi")
å¨åç±»Girlä¸ï¼å 为éåäºç¶ç±»ç`__init__`æ¹æ³ï¼å¦æè¦è°ç¨ç¶ç±»è¯¥æ¹æ³ï¼å¨ä¸èä¸ä¸å¾ä¸ä½¿ç¨`super(Girl, self).__init__()`è°ç¨ç¶ç±»ä¸å 为åç±»æ¹æ³éåè被é®è½çååæ¹æ³ã
å
¶å®ï¼å¨åç±»ä¸ï¼ç¶ç±»çæ¹æ³å°±æ¯**éç»å®æ¹æ³**ï¼å 为å¨åç±»ä¸ï¼æ²¡æå»ºç«ç¶ç±»çå®ä¾ï¼å´è¦æ¯ç¨ç¶ç±»çæ¹æ³ã对äºè¿ç§éç»å®æ¹æ³çè°ç¨ï¼è¿æä¸ç§æ¹å¼ãä¸è¿è¿ç§æ¹å¼ç°å¨å·²ç»è¾å°æ¯ç¨äºï¼å 为æäºsuper彿°ãä¸ºäºæ¹ä¾¿è¯»è
çå
¶å®æå
³ä»£ç ï¼è¿æ¯è¦ç®è¦è¯´æã
ä¾å¦å¨ä¸é¢ä»£ç ä¸ï¼å¨ç±»Girl䏿³è°ç¨ç¶ç±»Personçåå§å彿°ï¼åéè¦å¨åç±»ä¸ï¼åä¸è¿ä¹ä¸è¡ï¼
Person.__init__(self)
è¿ä¸æ¯éè¿å®ä¾è°ç¨çï¼èæ¯éè¿ç±»Personå®ç°äºå¯¹`__init__(self)`çè°ç¨ãè¿å°±æ¯è°ç¨éç»å®æ¹æ³çç¨éã使¯ï¼è¿ç§æ¹æ³å·²ç»è¢«super彿°åä»£ï¼æä»¥ï¼å¦æè¯»è
å¨ç¼ç¨ä¸éå°ç±»ä¼¼æ
åµï¼æ¨è使ç¨super彿°ã
##éææ¹æ³åç±»æ¹æ³
å·²ç¥ï¼ç±»çæ¹æ³ç¬¬ä¸ä¸ªåæ°å¿
é¡»æ¯selfï¼å¹¶ä¸å¦æè¦è°ç¨ç±»çæ¹æ³ï¼å¿
é¡»å°éè¿ç±»çå®ä¾ï¼å³æ¹æ³ç»å®å®ä¾åæè½ç±å®ä¾è°ç¨ã妿ä¸ç»å®ï¼ä¸è¬å¨ç»§æ¿å
³ç³»çç±»ä¹é´ï¼å¯ä»¥ç¨super彿°çæ¹æ³è°ç¨ã
è¿éåä»ç»ä¸ç§æ¹æ³ï¼è¿ç§æ¹æ³çè°ç¨æ¹å¼è·ä¸è¿°çé½ä¸åï¼è¿å°±æ¯ï¼éææ¹æ³åç±»æ¹æ³ãç代ç ï¼
#!/usr/bin/env python
# coding=utf-8
__metaclass__ = type
class StaticMethod:
@staticmethod
def foo():
print "This is static method foo()."
class ClassMethod:
@classmethod
def bar(cls):
print "This is class method bar()."
print "bar() is part of class:", cls.__name__
if __name__ == "__main__":
static_foo = StaticMethod() #å®ä¾å
static_foo.foo() #å®ä¾è°ç¨éææ¹æ³
StaticMethod.foo() #éè¿ç±»æ¥è°ç¨éææ¹æ³
print "********"
class_bar = ClassMethod()
class_bar.bar()
ClassMethod.bar()
对äºè¿é¨å代ç ï¼æä¸å¤é常ç¹å«ï¼é£å°±æ¯å
å«äºâ@â符å·ãå¨pythonä¸ï¼
- `@staticmethod`表示ä¸é¢çæ¹æ³æ¯éææ¹æ³
- `@classmethod`表示ä¸é¢çæ¹æ³æ¯ç±»æ¹æ³
ä¸ä¸ªä¸ä¸ªæ¥çã
å
çéææ¹æ³ï¼è½ç¶åä¸ºéææ¹æ³ï¼ä½ä¹æ¯æ¹æ³ï¼æä»¥ï¼ä¾ç¶ç¨defè¯å¥æ¥å®ä¹ãéè¦æ³¨æçæ¯æä»¶ååé¢çæ¬å·å
ï¼æ²¡æselfï¼è¿ååé¢å®ä¹çç±»ä¸çæ¹æ³æ¯ä¸åçï¼ä¹æ£æ¯å çè¿ä¸ªä¸åï¼æç»å®å¦å¤åäºä¸ä¸ªååå«åéææ¹æ³ï¼å¦åä¸å°±â泯ç¶ä¼äººç£âãå¦ææ²¡æselfï¼é£ä¹ä¹å°±æ æ³è®¿é®å®ä¾åéãç±»åå®ä¾ç屿§äºï¼å 为å®ä»¬é½æ¯åå©selfæ¥ä¼ éæ°æ®çã
å¨çç±»æ¹æ³ï¼åæ ·ä¹å
·æä¸è¬æ¹æ³çç¹ç¹ï¼åºå«ä¹å¨åæ°ä¸ãç±»æ¹æ³ç忰乿²¡æselfï¼ä½æ¯å¿
é¡»æclsè¿ä¸ªåæ°ãå¨ç±»æ¹æ³ä¸ï¼è½å¤è®¿é®ç±»å±æ§ï¼ä½æ¯ä¸è½è®¿é®å®ä¾å±æ§ï¼è¯»è
å¯ä»¥èªè¡è®¾è®¡ä»£ç æ£éªä¹ï¼ã
ç®è¦æç¡®ä¸¤ç§æ¹æ³ãä¸é¢çè°ç¨æ¹æ³ãä¸¤ç§æ¹æ³é½å¯ä»¥éè¿å®ä¾è°ç¨ï¼å³ç»å®å®ä¾ãä¹å¯ä»¥éè¿ç±»æ¥è°ç¨ï¼å³`StaticMethod.foo()`è¿æ ·çå½¢å¼ï¼è¿ä¹æ¯åºå«ä¸è¬æ¹æ³çå°æ¹ï¼ä¸è¬æ¹æ³å¿
é¡»ç¨éè¿ç»å®å®ä¾è°ç¨ã
ä¸è¿°ä»£ç è¿è¡ç»æï¼
$ python 21001.py
This is static method foo().
This is static method foo().
********
This is class method bar().
bar() is part of class: ClassMethod
This is class method bar().
bar() is part of class: ClassMethod
è¿æ¯å
³äºéææ¹æ³åç±»æ¹æ³çç®è¦ä»ç»ã
æ£å½ææèå¦ä½è®²è§£çæ´æ·±å
¥ä¸ç¹çæ¶åï¼ææ³èµ·äºä»¥å¾çè¿çä¸ç¯æç« ï¼è§å¾äººå®¶è®²çé常å°ä½ãæä»¥ï¼ä¸æ¢åå¬ï¼æ´ä¸æ¢çé¨å¼æ§ï¼æä»¥å¹²èæé£ç¯æç« æææ¬æ¬çæå½äºæ¤ãåæ¶ï¼è¯»è
ä»ä¸é¢çæç« ä¸ï¼ä¹è½å¯¹åé¢çç¥è¯å¤ä¹ ä¸ä¸ãæç« æ 颿¯ï¼pythonä¸çstaticmethodåclassmethodçå·®å¼ãåè½½ï¼www.pythoncentral.io/difference-between-staticmethod-and-classmethod-in-python/ãæ¤å°åéè¦ä½ å夿¢¯åæè½æµè§ãåç»å½äººç¿»è¯ï¼å°åæ¯ï¼http://www.wklken.me/posts/2013/12/22/difference-between-staticmethod-and-classmethod-in-python.html
以䏿¯ç¿»è¯æç« ï¼
###Class vs static methods in Python
è¿ç¯æç« è¯å¾è§£éï¼ä»ä¹äºstaticmethod/classmethod,å¹¶ä¸è¿ä¸¤è
ä¹é´çå·®å¼.
staticmethodåclassmethodå被ä½ä¸ºè£
饰å¨ï¼ç¨ä½å®ä¹ä¸ä¸ªå½æ°ä¸º"staticmethod"è¿æ¯"classmethod"
妿æ³è¦äºè§£Pythonè£
饰å¨çåºç¡ï¼å¯ä»¥ç[è¿ç¯æç« ](http://www.pythoncentral.io/python-decorators-overview/)
###Simple, static and class methods
ç±»ä¸æå¸¸ç¨å°çæ¹æ³æ¯ å®ä¾æ¹æ³(instance methods), å³ï¼å®ä¾å¯¹è±¡ä½ä¸ºç¬¬ä¸ä¸ªåæ°ä¼ éç»å½æ°
ä¾å¦ï¼ä¸é¢æ¯ä¸ä¸ªåºæ¬çå®ä¾æ¹æ³
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 æä»¬ä¸éè¦æ¾å¼æä¾å®ä¾ï¼è§£é卿¬èº«ä¼å¤ç
å妿们æ³ä»
å®ç°ç±»ä¹é´äº¤äºè䏿¯éè¿å®ä¾ï¼æä»¬å¯ä»¥å¨ç±»ä¹å¤å»ºç«ä¸ä¸ªç®åç彿°æ¥å®ç°è¿ä¸ªåè½ï¼ä½æ¯å°ä¼ä½¿ä»£ç æ©æ£å°ç±»ä¹å¤ï¼è¿ä¸ªå¯è½å¯¹æªæ¥ä»£ç ç»´æ¤å¸¦æ¥é®é¢ã
ä¾å¦ï¼
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
###The Python @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()
We get the following output:
2
2
###The Python @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
###How @staticmethod and @classmethod are different
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: (