Python學(xué)習(xí)之面向?qū)ο缶幊?/h1>

Python學(xué)習(xí)目錄

  1. 在Mac下使用Python3
  2. Python學(xué)習(xí)之?dāng)?shù)據(jù)類型
  3. Python學(xué)習(xí)之函數(shù)
  4. Python學(xué)習(xí)之高級特性
  5. Python學(xué)習(xí)之函數(shù)式編程
  6. Python學(xué)習(xí)之模塊
  7. Python學(xué)習(xí)之面向?qū)ο缶幊?/a>
  8. Python學(xué)習(xí)之面向?qū)ο蟾呒壘幊?/a>
  9. Python學(xué)習(xí)之錯(cuò)誤調(diào)試和測試
  10. Python學(xué)習(xí)之IO編程
  11. Python學(xué)習(xí)之進(jìn)程和線程
  12. Python學(xué)習(xí)之正則
  13. Python學(xué)習(xí)之常用模塊
  14. Python學(xué)習(xí)之網(wǎng)絡(luò)編程

面向?qū)ο缶幊獭狾bject Oriented Programming,簡稱OOP,是一種程序設(shè)計(jì)思想。OOP把對象作為程序的基本單元效扫,一個(gè)對象包含了數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)歼捏。

類和實(shí)例

定義

class Student(object):
    pass

stone = Student()
stone.name = "stone"
stone.age = 2

print(stone.name, stone.age)

上面代碼中:

  • class后面緊接的是類名昏兆,類名以大寫字母開頭
  • (object)是該類從哪個(gè)類繼承下來的
  • 使用時(shí)候可以自由的給實(shí)例變量綁定屬性

方法

class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def print_info(self):
        print(self.name, self.age)
        
stone = Student("stone", 18)
stone.print_info()

上面代碼中:

  • __init__方法的第一個(gè)參數(shù)永遠(yuǎn)是self有梆,表示創(chuàng)建的實(shí)例本身,因此瞒御,在__init__方法內(nèi)部,就可以把各種屬性綁定到self神郊,因?yàn)?code>self就指向創(chuàng)建的實(shí)例本身肴裙。類似于java的構(gòu)造函數(shù)。
  • 定義一個(gè)方法涌乳,除了第一個(gè)參數(shù)是self外践宴,其他和普通函數(shù)一樣。要調(diào)用一個(gè)方法爷怀,只需要在實(shí)例變量上直接調(diào)用阻肩,除了self不用傳遞,其他參數(shù)正常傳入运授。

訪問限制

  • 實(shí)例的變量名如果以__開頭烤惊,就變成了一個(gè)私有變量(private),只有內(nèi)部可以訪問吁朦,外部不能訪問柒室。
  • 變量名類似__xxx__的,也就是以雙下劃線開頭逗宜,并且以雙下劃線結(jié)尾的雄右,是特殊變量空骚,特殊變量是可以直接訪問的,不是private變量擂仍。

繼承和多態(tài)

在OOP程序設(shè)計(jì)中囤屹,當(dāng)我們定義一個(gè)class的時(shí)候,可以從某個(gè)現(xiàn)有的class繼承逢渔,新的class稱為子類(Subclass)肋坚,而被繼承的class稱為基類、父類或超類(Base class肃廓、Super class)智厌。和java一樣。

靜態(tài)語言 vs 動(dòng)態(tài)語言:

對于靜態(tài)語言(例如Java)來說盲赊,如果需要傳入Animal類型铣鹏,則傳入的對象必須是Animal類型或者它的子類,否則哀蘑,將無法調(diào)用Animal中的方法吝沫。對于Python這樣的動(dòng)態(tài)語言來說,則不一定需要傳入Animal類型递礼。我們只需要保證傳入的對象有Animal中的方法就可以了惨险。

對象信息

使用type()

>>> import types
>>> def fn():
...     pass
...
>>> type(fn)==types.FunctionType
True
>>> type(abs)==types.BuiltinFunctionType
True
>>> type(lambda x: x)==types.LambdaType
True
>>> type((x for x in range(10)))==types.GeneratorType
True

以上代碼可以看出,判斷基本數(shù)據(jù)類型可以直接寫int脊髓,str等辫愉,但如果要判斷一個(gè)對象是否是函數(shù)怎么辦?可以使用types模塊中定義的常量将硝。

使用isinstance()

>>> isinstance([1, 2, 3], (list, tuple))
True
>>> isinstance((1, 2, 3), (list, tuple))
Tru

可以判斷一個(gè)變量是否是某些類型中的一種恭朗,比如上面的代碼就可以判斷是否是list或者tuple

使用dir()

如果要獲得一個(gè)對象的所有屬性和方法,可以使用dir()函數(shù)依疼,它返回一個(gè)包含字符串的list痰腮,比如,獲得一個(gè)str對象的所有屬性和方法:

>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

類似__xxx__的屬性和方法在Python中都是有特殊用途的律罢,比如__len__方法返回長度膀值。在Python中,如果你調(diào)用len()函數(shù)試圖獲取一個(gè)對象的長度误辑,實(shí)際上沧踏,在len()函數(shù)內(nèi)部,它自動(dòng)去調(diào)用該對象的__len__()方法巾钉,所以翘狱,下面的代碼是等價(jià)的:

>>> len('ABC')
3
>>> 'ABC'.__len__()
3

我們自己寫的類,如果也想用len(myObj)的話砰苍,就自己寫一個(gè)__len__()方法:

>>> class MyDog(object):
...     def __len__(self):
...         return 100
...
>>> dog = MyDog()
>>> len(dog)
100

僅僅把屬性和方法列出來是不夠的潦匈,配合getattr()阱高、setattr()以及hasattr(),我們可以直接操作一個(gè)對象的狀態(tài):

>>> class MyObject(object):
...     def __init__(self):
...         self.x = 9
...     def power(self):
...         return self.x * self.x
...
>>> obj = MyObject()

緊接著茬缩,可以測試該對象的屬性:

>>> hasattr(obj, 'x') # 有屬性'x'嗎赤惊?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有屬性'y'嗎?
False
>>> setattr(obj, 'y', 19) # 設(shè)置一個(gè)屬性'y'
>>> hasattr(obj, 'y') # 有屬性'y'嗎寒屯?
True
>>> getattr(obj, 'y') # 獲取屬性'y'
19
>>> obj.y # 獲取屬性'y'
19

也可以獲得對象的方法:

>>> hasattr(obj, 'power') # 有屬性'power'嗎?
True
>>> getattr(obj, 'power') # 獲取屬性'power'
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn = getattr(obj, 'power') # 獲取屬性'power'并賦值到變量fn
>>> fn # fn指向obj.power
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn() # 調(diào)用fn()與調(diào)用obj.power()是一樣的
81

實(shí)例屬性和類屬性

類本身需要綁定一個(gè)屬性:

class Student(object):
    name = 'Student'

當(dāng)我們定義了一個(gè)類屬性后黍少,這個(gè)屬性雖然歸類所有寡夹,但類的所有實(shí)例都可以訪問到。來測試一下:

>>> class Student(object):
...     name = 'Student'
...
>>> s = Student() # 創(chuàng)建實(shí)例s
>>> print(s.name) # 打印name屬性厂置,因?yàn)閷?shí)例并沒有name屬性菩掏,所以會(huì)繼續(xù)查找class的name屬性
Student
>>> print(Student.name) # 打印類的name屬性
Student
>>> s.name = 'Michael' # 給實(shí)例綁定name屬性
>>> print(s.name) # 由于實(shí)例屬性優(yōu)先級比類屬性高,因此昵济,它會(huì)屏蔽掉類的name屬性
Michael
>>> print(Student.name) # 但是類屬性并未消失智绸,用Student.name仍然可以訪問
Student
>>> del s.name # 如果刪除實(shí)例的name屬性
>>> print(s.name) # 再次調(diào)用s.name,由于實(shí)例的name屬性沒有找到访忿,類的name屬性就顯示出來了
Student

下一篇:Python學(xué)習(xí)之面向?qū)ο蟾呒壘幊?/a>

  • 序言:七十年代末瞧栗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子海铆,更是在濱河造成了極大的恐慌迹恐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卧斟,死亡現(xiàn)場離奇詭異殴边,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)珍语,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門锤岸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人板乙,你說我怎么就攤上這事是偷。” “怎么了募逞?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵晓猛,是天一觀的道長。 經(jīng)常有香客問我凡辱,道長戒职,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任透乾,我火速辦了婚禮洪燥,結(jié)果婚禮上磕秤,老公的妹妹穿的比我還像新娘。我一直安慰自己捧韵,他們只是感情好市咆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著再来,像睡著了一般蒙兰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芒篷,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天搜变,我揣著相機(jī)與錄音,去河邊找鬼针炉。 笑死挠他,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的篡帕。 我是一名探鬼主播殖侵,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼镰烧!你這毒婦竟也來了拢军?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤怔鳖,失蹤者是張志新(化名)和其女友劉穎朴沿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體败砂,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赌渣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昌犹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坚芜。...
    茶點(diǎn)故事閱讀 40,021評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斜姥,靈堂內(nèi)的尸體忽然破棺而出鸿竖,到底是詐尸還是另有隱情,我是刑警寧澤铸敏,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布缚忧,位于F島的核電站,受9級特大地震影響杈笔,放射性物質(zhì)發(fā)生泄漏闪水。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一蒙具、第九天 我趴在偏房一處隱蔽的房頂上張望球榆。 院中可真熱鬧朽肥,春花似錦、人聲如沸持钉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽每强。三九已至始腾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間空执,已是汗流浹背浪箭。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脆烟,地道東北人山林。 一個(gè)月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓房待,卻偏偏與公主長得像邢羔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子桑孩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容