>ç±æ¯æä¹
å¿èï¼åææ©æ
ï¼ç±æ¯ä¸å«å¦ï¼ç±æ¯ä¸èªå¤¸ï¼ä¸å¼ çï¼ä¸ä½å®³ç¾çäºï¼ä¸æ±èªå·±ççå¤ï¼ä¸è½»æåæï¼ä¸è®¡ç®äººçæ¶ï¼ä¸å欢ä¸ä¹ï¼åªå欢ççï¼å¡äºå
容ï¼å¡äºç¸ä¿¡ï¼å¡äºç¼æï¼å¡äºå¿èã(1 CORINTHIANS 13:4-7)
#夿åå°è£
â夿âåâå°è£
âæ¯OOPçéè¦ç¹å¾ââåé¢è¯´çâç»§æ¿â乿¯ã使¯ï¼å¯¹äºPythonèè¨ï¼å¯¹è¿ä¸¤ä¸ªççè§£ä¹æå¾å¤ä¸åã建议读è
âåç¾å®¶å®´âï¼å°ç½ä¸æä¸ææå
³è¯é¢ï¼ä¸å°äººåäºæç« æ¥è®¨è®ºã
##夿
è¿éæä»
ä»
é对åå¦è
ï¼æç
§èªå·±ççè§£ï¼è°è°é¶åºç¡å¦Pythonç读è
å¯ä»¥ææ ·çè§£â夿âï¼å 为â夿âå°±å¦åå
¶åå䏿 ·ï¼å¨çè§£ä¸ä¹æ¯â夿âçã
å
æ¥çè¿æ ·çä¾åï¼
>>> "This is a book".count("s")
2
>>> [1,2,4,3,5,3].count(3)
2
ä¸é¢ç`count()`çä½ç¨æ¯æ°ä¸æ°æä¸ªå
ç´ å¨å¯¹è±¡ä¸åºç°ç次æ°ãä»ä¾åä¸å¯ä»¥çåºï¼æä»¬å¹¶æ²¡æéå®`count()`çåæ°ç±»åã类似çä¾åè¿æï¼
>>> f = lambda x,y:x+y
è¿è®°å¾è¿ä¸ª`lambda`彿°åï¼å¦æå¿è®°äºï¼è¯·å¤ä¹ [彿°(5)](./237.md)ä¸å¯¹æ¤çè§£éã
>>> f(2,3)
5
>>> f("qiw","sir")
'qiwsir'
>>> f(["python","java"],["c++","lisp"])
['python', 'java', 'c++', 'lisp']
è¿éæä»¬æ²¡æéå¶åæ°çç±»åï¼ä¹ä¸å®ä¸è½éå¶ï¼å ä¸ºå¦æéå¶äºï¼å°±ä¸æ¯pythonicäºãå¨ä½¿ç¨çæ¶åï¼å¯ä»¥ç»åæ°ä»»æç±»åï¼é½è½å¾å°ä¸æ¥éçç»æã
以ä¸ï¼å°±ä½ç°äºâ夿âââåä¸ç§è¡ä¸ºå
·æä¸å表ç°å½¢å¼åå½¢æçè½åï¼æ¢ä¸ç§è¯´æ³ï¼å°±æ¯å¯¹è±¡å¤ç§è¡¨ç°å½¢å¼çä½ç°ã
å½ç¶ï¼ä¹æäººå°±æ¤æåºäºå对æè§ï¼å 为æ¬è´¨ä¸æ¯å¨åæ°ä¼ å
¥å¼ä¹åï¼Python并没æç¡®å®åæ°çç±»åï¼åªè½è®©æ°æ®è¿å
¥å½æ°ä¹ååå¤çï¼è½å¤çåç½¢ï¼ä¸è½å¤çå°±æ¥éãä¾å¦ï¼
>>> f("qiw", 2)
Traceback (most recent call last):
File "", line 1, in
File "", line 1, in
TypeError: cannot concatenate 'str' and 'int' objects
æ¬ä¹¦ç±äºä¸å±äºè¿ç§æ¦å¿µäºè®ºèç´ï¼æä»¥ä¸è¿è¡è¿æ¹é¢çæ·±å
¥æ¢ç´¢ï¼ä»
ä»
æ¯åè¯åä½è¯»è
ç¸å
³ä¿¡æ¯ãå¹¶ä¸ï¼ä¹æ¯æç
§â人äºäº¦äºâçååï¼æ¢ç¶å¤§å¤æ°ç¨åºåé½å¨è®¨è®ºå¤æï¼é£ä¹æä»¬å°±æç
§å¤§å¤æ°äººè¯´çå»ä»ç»ï¼å°½ç®¡ææ¶åççææ¡å¨å°æ°äººæä¸ï¼ã
â夿âï¼è±ææ¯:Polymorphismï¼å¨å°æ¹¾è¢«ç§°ä½âå¤åâãç»´åºç¾ç§ä¸å¯¹æ¤æè¯¦ç»è§£é说æã
>å¤åï¼è±è¯ï¼Polymorphismï¼ï¼æ¯æç©ä»¶å°åç¨å¼å·è¡æï¼ç¸åçè¨æ¯å¯è½æé給å¤åä¸åçé¡å¥ä¹ç©ä»¶ï¼è系統å¯ä¾æç©ä»¶æå±¬é¡å¥ï¼å¼ç¼å°æé¡å¥çæ¹æ³ï¼èæä¸åçè¡çºãç°¡å®ä¾èªªï¼æè¬å¤åææç¸åçè¨æ¯çµ¦äºä¸åçç©ä»¶æå¼ç¼ä¸åçåä½ç¨±ä¹ã
åç®åç说æ³å°±æ¯âæå¤ç§å½¢å¼âï¼å°±ç®ä¸ç¥éåéï¼åæ°ï¼æå¼ç¨ç对象类åï¼ä¹ä¸æ ·è½è¿è¡æä½ï¼æ¥è
ä¸æãæ¯å¦ä¸é¢æ¾ç¤ºçä¾åãå¨Pythonä¸ï¼æ´ä¸ºpythonicçåæ³æ¯æ ¹æ¬å°±ä¸è¿è¡ç±»åæ£éªã
ä¾å¦èåç`repr()`彿°ï¼å®è½å¤é对è¾å
¥çä»»ä½å¯¹è±¡è¿åä¸ä¸ªå符串ãè¿å°±æ¯å¤æç代表ä¹ä¸ã
>>> repr([1,2,3])
'[1, 2, 3]'
>>> repr(1)
'1'
>>> repr({"lang":"python"})
"{'lang': 'python'}"
使ç¨å®åä¸ä¸ªå°å½æ°ï¼è¿æ¯ä½ä¸ºå¤æä»£è¡¨çã
>>> def length(x):
... print "The length of", repr(x), "is", len(x)
...
>>> length("how are you")
The length of 'how are you' is 11
>>> length([1,2,3])
The length of [1, 2, 3] is 3
>>> length({"lang":"python","book":"itdiffer.com"})
The length of {'lang': 'python', 'book': 'itdiffer.com'} is 2
ä¸è¿ï¼å¤æä¹ä¸æ¯ä¸è½çï¼å¦æè¿æ ·åï¼
>>> length(7)
The length of 7 is
Traceback (most recent call last):
File "", line 1, in
File "", line 2, in length
TypeError: object of type 'int' has no len()
æ¥éäºãçé误æç¤ºï¼æç¡®åè¯äºæä»¬`object of type 'int' has no len()`ã
ä¸è¿°çç§ç§å¤æè¡¨ç°ï¼çå 为Pythonæ¯ä¸ç§è§£éåçè¯è¨ï¼ä¸éè¦è¿è¡é¢ç¼è¯ï¼åªå¨è¿è¡æ¶æç¡®å®ç¶æãæä»¥ï¼Pythonå°±è¢«è®¤ä¸ºå¤©çæ¯ä¸ç§å¤æçè¯è¨ãä¹æäººæç¸åè§ç¹ï¼è®¤ä¸ºPython䏿¯æå¤æï¼å¨çç±ä¸ï¼ä¹ç¨äºä¸è¿°å
容ãçæ¥ï¼ççåæ¯æ°´ï¼çç¡®è½å¤æä¸åçç»è®ºâââè¿æåæ¯æ°´å¢ï¼âåâè¿å©åæ¯æ°´äºï¼âã
äºè®ºï¼è®©ç»ææ³è
ãæä»¬ï¼å´è§ã
å¨è¯¸å¤ä»ç»å¤æçæç« ä¸ï¼é½ä¼æè¿æ ·å
³äºç«åççä¾åãè¿éä¹å°ä»£ç è´´åºæ¥ï¼è¯»è
å»ä½ä¼æè°å¤æä½ç°ãå
¶å®ï¼å¦æä½ è¿å
¥äºPythonçè¯å¢ï¼ææ¶åæ¯ä¸ç»æå°±å·²ç»å¨åºç¨å¤æç¹æ§å¢ã
#!/usr/bin/env python
# coding=utf-8
"the code is from: http://zetcode.com/lang/python/oop/"
class Animal(object): #Python 3: class Animal:
def __init__(self, name=""):
self.name = name
def talk(self):
pass
class Cat(Animal):
def talk(self):
print "Meow!" #Python 3: print('Meow!')ï¼ä¸åï¼ä»ç¥
class Dog(Animal):
def talk(self):
print "Woof!"
a = Animal()
a.talk()
c = Cat("Missy")
c.talk()
d = Dog("Rocky")
d.talk()
ä¿ååè¿è¡ä¹ï¼
$ python 21101.py
Meow!
Woof!
代ç 䏿`Cat`å`Dog`两个类ï¼é½ç»§æ¿äºç±»`Animal`ï¼å®ä»¬é½æ`talk()`æ¹æ³ï¼è¾å
¥ä¸åçå¨ç©åç§°ï¼ä¼å¾åºç¸åºçç»æã
æ ¹æ®åé¢å·²ç»å¦ä¹ è¿çç±»åç»§æ¿çç¥è¯ï¼æä»¬ç¥éï¼å¯¹äºå®ä¾`c`æ¯Catç±»åç对象ï¼`d`æ¯Dogç±»åç对象ï¼ä½å®ä»¬ä¹é½æ¯Animalç±»åç对象ââç±»ï¼ä¹æ¯ä¸ç§å¯¹è±¡ç±»åï¼è¿æ ·ï¼ä¸è®ºæ¯è°ï¼ä¹é½æ`Animal`ç±»æè§å®çæ¹æ³å屿§ââ夿就ä½ç°å¨è¿éââç»§æ¿äº`Animal`çåç±»ï¼å®ä¾åä¹åé½å¯ä»¥å
·æ`Animal`ç表ç°å½¢å¼ã
对â夿âççè§£ï¼è¿å¯ä»¥å¨å®è·µä¸æ
¢æ
¢å¢å ã
å
³äºå¤æï¼æä¸ä¸ªè¢«ç§°ä½âé¸åç±»åâ(duck typeing)çä¸è¥¿ï¼å
¶å«ä¹å¨ç»´åºç¾ç§ä¸è¢«è¡¨è¿°ä¸ºï¼
>å¨ç¨åºè®¾è®¡ä¸ï¼é¸åç±»åï¼è±è¯ï¼duck typingï¼æ¯å¨æç±»åçä¸ç§é£æ ¼ãå¨è¿ç§é£æ ¼ä¸ï¼ä¸ä¸ªå¯¹è±¡ææçè¯ä¹ï¼ä¸æ¯ç±ç»§æ¿èªç¹å®çç±»æå®ç°ç¹å®çæ¥å£ï¼èæ¯ç±å½åæ¹æ³å屿§çéåå³å®ãè¿ä¸ªæ¦å¿µçå忥æºäºç±James Whitcomb Rileyæåºçé¸åæµè¯ï¼è§ä¸é¢çâåå²âç« èï¼ï¼âé¸åæµè¯âå¯ä»¥è¿æ ·è¡¨è¿°ï¼âå½çå°ä¸åªé¸èµ°èµ·æ¥åé¸åãæ¸¸æ³³èµ·æ¥åé¸åãå«èµ·æ¥ä¹åé¸åï¼é£ä¹è¿åªé¸å°±å¯ä»¥è¢«ç§°ä¸ºé¸åãâ
对äºé¸åç±»åï¼ä¹æ¯æäºè®®çãè¿æ¹é¢ç详ç»ä¿¡æ¯ï¼è¯»è
å¯ä»¥å»çæå
³ç»´åºç¾ç§çä»ç»ã
对äºå¤æé®é¢ï¼æåè¿è¦å诫读è
ï¼ç±»åæ£æ¥æ¯æ¯æå¤æçå©å¨ï¼æ¯å¦typeãisinstance以åisubclass彿°ï¼æä»¥ï¼ä¸å®è¦æ
ç¨è¿äºç±»åæ£æ¥å½æ°ã
##å°è£
åç§æå
âå°è£
âï¼æ¯ä¸æ¯æä»£ç åå°æä¸ªä¸è¥¿éé¢ï¼â人âå¨ç¼è¾å¨ä¸æå¼ï¼å°±çä¸å°äºå¢ï¼
é¤éæ¯ä½ çæ¾ç¤ºå¨åäºã
å¨ç¨åºè®¾è®¡ä¸ï¼å°è£
(Encapsulation)æ¯å¯¹å
·ä½å¯¹è±¡çä¸ç§æ½è±¡ï¼å³å°æäºé¨åéèèµ·æ¥ï¼å¨ç¨åºå¤é¨çä¸å°ï¼å³æ æ³è°ç¨ï¼ä¸æ¯äººç¨ç¼ççä¸å°é£ä¸ªä»£ç ï¼é¤éç¨æç§å 坿è
æ··æ·æ¹æ³ï¼é æç°å®ä¸çå°é¾ï¼ä½è¿ä¸æ¯å°è£
ï¼ã
è¦äºè§£å°è£
ï¼ç¦»ä¸å¼âç§æåâï¼å°±æ¯å°ç±»æè
彿°ä¸çæäºå±æ§éå¶å¨æä¸ªåºåä¹å
ï¼å¤é¨æ æ³è°ç¨ã
Pythonä¸ç§æåçæ¹æ³ä¹æ¯è¾ç®åï¼å°±æ¯å¨åå¤ç§æåç屿§ï¼å
æ¬æ¹æ³ãæ°æ®ï¼åååé¢å åä¸å线ãä¾å¦ï¼
#!/usr/bin/env python
# coding=utf-8
class ProtectMe(object): #Python 3: class ProtectMe:
def __init__(self):
self.me = "qiwsir"
self.__name = "kivi"
def __python(self):
print "I love Python." #Python 3: print("I love Python.")ï¼ä¸åï¼ä»ç¥
def code(self):
print "Which language do you like?"
self.__python()
if __name__ == "__main__":
p = ProtectMe()
print p.me
print p.__name
è¿è¡ä¸ä¸ï¼ççææï¼
$ python 21102.py
qiwsir
Traceback (most recent call last):
File "21102.py", line 21, in
print p.__name
AttributeError: 'ProtectMe' object has no attribute '__name'
æ¥çæ¥éä¿¡æ¯ï¼åè¯æä»¬æ²¡æ`__name`é£ä¸ªå±æ§ãæç¶éèäºï¼å¨ç±»çå¤é¢æ æ³è°ç¨ãåè¯è¯é£ä¸ªå½æ°ï¼å¯å¦ï¼
if __name__ == "__main__":
p = ProtectMe()
p.code()
p.__python()
ä¿®æ¹è¿é¨åå³å¯ãå
¶ä¸`p.code()`çæå¾æ¯è¦æå°åºä¸¤å¥è¯ï¼`"Which language do you like?"`å`"I love Python."`ï¼`code()`æ¹æ³å`__python()`æ¹æ³å¨åä¸ä¸ªç±»ä¸ï¼å¯ä»¥è°ç¨ä¹ãåé¢çé£ä¸ª`p.__python()`è¯å¾è°ç¨é£ä¸ªç§ææ¹æ³ãççææï¼
$ python 21102.py
Which language do you like?
I love Python.
Traceback (most recent call last):
File "21102.py", line 23, in
p.__python()
AttributeError: 'ProtectMe' object has no attribute '__python'
妿¿ä»¥å¿ã该è°ç¨çè°ç¨äºï¼è¯¥éèçéèäºã
ç¨ä¸é¢çæ¹æ³ï¼çç¡®åå°äºå°è£
ã使¯ï¼æå¦æè¦è°ç¨é£äºç§æå±æ§ï¼æä¹åï¼
å¯ä»¥ä½¿ç¨`property`彿°ã
#!/usr/bin/env python
# coding=utf-8
class ProtectMe(object): #Python 3: class ProtectMe:
def __init__(self):
self.me = "qiwsir"
self.__name = "kivi"
@property
def name(self):
return self.__name
if __name__ == "__main__":
p = ProtectMe()
print p.name #Python 3: print(p.name)
è¿è¡ç»æï¼
$ python 21102.py
kivi
ä»ä¸é¢å¯ä»¥çåºï¼ç¨äº`@property`ä¹åï¼å¨è°ç¨é£ä¸ªæ¹æ³çæ¶åï¼ç¨çæ¯`p.name`çå½¢å¼ï¼å°±å¥½åå¨è°ç¨ä¸ä¸ªå±æ§ä¸æ ·ï¼è·åé¢`p.me`çæ ¼å¼ç¸åã
çæ¥ï¼å°è£
çç¡®ä¸æ¯è®©â人çä¸è§âã
------
[æ»ç®å½](./index.md) | [ä¸èï¼ç±»(5)](./209.md) | [ä¸èï¼å®å¶ç±»](./239.md)
å¦æä½ è®¤ä¸ºæå¿
è¦æèµæï¼è¯·éè¿æ¯ä»å®ï¼**[email protected]**,ä¸èææ¿ã