速擼《python學(xué)習(xí)手冊(cè)》--第25-21章-類

第25章-OOP:宏偉藍(lán)圖

為何使用類

與其他程序組成單元相比,類有三個(gè)獨(dú)到之處:

  • 多重實(shí)例:類基本上就是生產(chǎn)對(duì)象的工廠,每次調(diào)用一個(gè)類,都有獨(dú)立命名空間的新對(duì)象葫督。
  • 通過(guò)繼承進(jìn)行定制:類也支持OPP的繼承的概念。
  • 運(yùn)算符重載:通過(guò)提供特定的協(xié)議方法板惑,類可以重載運(yùn)算符橄镜。

第26章-類代碼編寫(xiě)基礎(chǔ)

類產(chǎn)生多個(gè)實(shí)例

  • 類對(duì)象和實(shí)例對(duì)象各自有獨(dú)立的命名空間。
  • 說(shuō)白了類就是實(shí)例的工廠函數(shù)

類對(duì)象提供默認(rèn)行為

  • class語(yǔ)句創(chuàng)建類對(duì)象并將其復(fù)制給變量名
  • class語(yǔ)句內(nèi)的賦值語(yǔ)句會(huì)創(chuàng)建類的屬性
  • 類屬性提供對(duì)象的狀態(tài)和行為

實(shí)例是具體的元素

  • 像函數(shù)那樣調(diào)用類對(duì)象會(huì)創(chuàng)建新的實(shí)例對(duì)象
  • 每個(gè)實(shí)例對(duì)象繼承類的屬性并獲得了自己的命名空間
  • 在方法內(nèi)懟self屬性做賦值運(yùn)算會(huì)產(chǎn)生每個(gè)實(shí)例自己的屬性

注意:

  • 可以對(duì)實(shí)例的直接賦值

類可以截獲python運(yùn)算符

  • 以雙下劃線命名的方法都是特殊鉤子洒放,可以用來(lái)攔截運(yùn)算
  • 當(dāng)實(shí)例出現(xiàn)在內(nèi)置運(yùn)算時(shí)蛉鹿,這類方法會(huì)自動(dòng)調(diào)用(指上述雙下劃線的方法)
  • 類可以覆蓋多數(shù)內(nèi)置類型運(yùn)算
  • 運(yùn)算符覆蓋方法沒(méi)有默認(rèn)值滨砍,而且也不需要
  • 運(yùn)算符可讓類與python的對(duì)象模型相繼承
In [294]: class rec:pass

In [295]: rec.name='damao'

In [296]: rec.age=18

In [297]: rec.name
Out[297]: 'damao'

In [298]: x=rec()

In [299]: x.age
Out[299]: 18

In [300]: x.name
Out[300]: 'damao'
    
In [301]: rec.__dict__
Out[301]:
mappingproxy({'__module__': '__main__',
              '__dict__': <attribute '__dict__' of 'rec' objects>,
              '__weakref__': <attribute '__weakref__' of 'rec' objects>,
              '__doc__': None,
              'name': 'damao',
              'age': 18})

In [302]: x.__dict__
Out[302]: {}

第27章 更多實(shí)例

第28章 類代碼編寫(xiě)細(xì)節(jié)

  • class是創(chuàng)建并且隱式賦值往湿,并不是聲明
  • 注意。類可以通過(guò)直接賦值來(lái)改變屬性值的惋戏。
In [303]: class ShareData:
     ...:     spam=42
     ...:

In [304]: x=ShareData()

In [305]: y=ShareData()

In [306]: x.spam
Out[306]: 42

In [307]: y.spam
Out[307]: 42

In [308]: ShareData.spam=24

In [309]: x.spam
Out[309]: 24

In [310]: y.spam
Out[310]: 24
   
In [311]: x.spam=100

In [312]: x.spam
Out[312]: 100

In [313]: y.spam
Out[313]: 24

In [314]: ShareData.spam
Out[314]: 24
  • 注意领追,在構(gòu)造時(shí),python只會(huì)找出并且調(diào)用一個(gè)__init__

  • 類的方法上如果使用了@abstractmethod响逢,那么這個(gè)類不能被實(shí)例話绒窑,它的子類如果沒(méi)有實(shí)現(xiàn)fun方法,也不能被實(shí)例化舔亭。

# 其中11是模塊屬性些膨,22是函數(shù)內(nèi)本地變量蟀俊,33是類屬性,44是方法中本地變量订雾,55是實(shí)例屬性
In [320]: X=11
     ...:
     ...: def f():
     ...:     print(X)
     ...:
     ...: def g():
     ...:     X=22
     ...:     print(X)
     ...:
     ...: class C:
     ...:     X=33
     ...:     def m(self):
     ...:         X=44
     ...:         self.X=55
     ...:

In [321]:

In [321]: print(X)
11

In [322]: f()
11

In [323]: g()
22

In [324]: print(X)
11

In [325]: obj=C()

In [326]: obj.X
Out[326]: 33

In [327]: obj.m()

In [328]: obj.x
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-328-b69ab213b68b> in <module>()
----> 1 obj.x

AttributeError: 'C' object has no attribute 'x'

In [329]: obj.X
Out[329]: 55

In [330]: C.X
Out[330]: 33

In [331]: C.m.X
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-331-68ecbd26cef2> in <module>()
----> 1 C.m.X

AttributeError: 'function' object has no attribute 'X'

In [332]: g.X
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-332-a8d85d587c9b> in <module>()
----> 1 g.X

AttributeError: 'function' object has no attribute 'X'

In [333]: obj.m.__dict__
Out[333]: {}
# 打印繼承樹(shù)
def classtree(cls, indent):
    print('.' * indent, cls.__name__)
    for supercls in cls.__bases__:
        classtree(supercls, indent + 3)


def instancetree(inst):
    print('Tree of %s' % inst)
    classtree(inst.__class__, 3)


def selftest():
    class A: pass

    class B(A): pass

    class C(A): pass

    class D(B, C): pass

    class E: pass

    class F(D, E): pass

    instancetree(B())
    instancetree(F())

第29章 運(yùn)算符重載

運(yùn)算符的重載其實(shí)就是一種攔截肢预。

# 定義__getitem__之后立馬就支持了for循環(huán)
In [381]: class stepper:
     ...:     def __getitem__(self, item):
     ...:         return self.data[item]
     ...:
     ...: X=stepper()
     ...:
     ...: X.data='Spam'
     ...:
     ...:

In [382]: X[1]
Out[382]: 'p'

In [383]: for item in X:
     ...:     print(item)
     ...:
S
p
a
m

python中所有的迭代環(huán)境都會(huì)先嘗試__iter__方法,再嘗試__getiterm__方法洼哎。iter方法是返回一個(gè)迭代器烫映,而getiterm方法是獲取偏移量重復(fù)索引。

In [384]: class Squares:
     ...:     def __init__(self, start, stop):
     ...:         self.value = start - 1
     ...:         self.stop = stop
     ...:     # 返回本身噩峦,所以這種方法只支持一個(gè)迭代器
     ...:     def __iter__(self):
     ...:         return self
     ...:
     ...:     def __next__(self):
     ...:         if self.value == self.stop:
     ...:             raise StopIteration
     ...:         self.value += 1
     ...:         return self.value ** 2
     ...:

In [385]:

In [385]: for i in Squares(1,5)
  File "<ipython-input-385-7c699374acfb>", line 1
    for i in Squares(1,5)
                         ^
SyntaxError: invalid syntax


In [386]: for i in Squares(1,5):
     ...:     print(i)
     ...:
1
4
9
16
25

In [387]: list(Squares)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-387-d7debed4f6f7> in <module>()
----> 1 list(Squares)

TypeError: 'type' object is not iterable

In [388]: list(Squares(1,6))
Out[388]: [1, 4, 9, 16, 25, 36]

In [389]: X=Squares(1,5)

In [390]: I=iter(X)

In [391]: next(I)
Out[391]: 1

In [392]: next(I)
Out[392]: 4

In [393]: next(I)
Out[393]: 9

In [394]: next(I)
Out[394]: 16

In [395]: next(I)
Out[395]: 25

In [396]: next(I)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-396-ebc5a6f5e444> in <module>()
----> 1 next(I)

<ipython-input-384-6f8e42cd1b09> in __next__(self)
      9     def __next__(self):
     10         if self.value == self.stop:
---> 11             raise StopIteration
     12         self.value += 1
     13         return self.value ** 2

StopIteration:
  • 雙下劃線開(kāi)頭的變量名會(huì)自動(dòng)擴(kuò)張锭沟,比如__spam,將擴(kuò)展成_x__spam
In [400]: class C1:
     ...:     def meth1(self):self.__X=88
     ...:     def meth2(self):print(self.__X)
     ...:
     ...: class C2:
     ...:     def metha(self):self.__X=99
     ...:     def methb(self):print(self.__X)
     ...:
     ...: class C3(C1,C2):pass
     ...:
     ...:

In [401]: I=C3()

In [402]:

In [402]: I.meth1()

In [403]: I.metha()

   
# 注意這個(gè)地方 值沒(méi)有被覆蓋了识补,跟下面做對(duì)比
In [404]: I.__dict__
Out[404]: {'_C1__X': 88, '_C2__X': 99}

In [405]: I.meth2()
88

In [406]: I.methb()
99

In [407]: class C1:
     ...:     def meth1(self):self.X=88
     ...:     def meth2(self):print(self.X)
     ...:
     ...: class C2:
     ...:     def metha(self):self.X=99
     ...:     def methb(self):print(self.X)
     ...:
     ...: class C3(C1,C2):pass
     ...:
     ...: I=C3()
     ...:
     ...:

In [408]: I.meth1()

In [409]: I.metha()

   
# 注意這個(gè)地方 值被覆蓋了
In [410]: I.__dict__
Out[410]: {'X': 99}

In [411]: I.meth2()
99

In [412]: I.methb()
99
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末族淮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凭涂,更是在濱河造成了極大的恐慌瞧筛,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件导盅,死亡現(xiàn)場(chǎng)離奇詭異较幌,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)白翻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門乍炉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人滤馍,你說(shuō)我怎么就攤上這事岛琼。” “怎么了巢株?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵槐瑞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我阁苞,道長(zhǎng)困檩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任那槽,我火速辦了婚禮悼沿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骚灸。我一直安慰自己糟趾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著义郑,像睡著了一般蝶柿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上非驮,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天只锭,我揣著相機(jī)與錄音,去河邊找鬼院尔。 笑死蜻展,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的邀摆。 我是一名探鬼主播纵顾,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼栋盹!你這毒婦竟也來(lái)了施逾?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤例获,失蹤者是張志新(化名)和其女友劉穎汉额,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體榨汤,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蠕搜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了收壕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妓灌。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蜜宪,靈堂內(nèi)的尸體忽然破棺而出虫埂,到底是詐尸還是另有隱情,我是刑警寧澤圃验,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布掉伏,位于F島的核電站,受9級(jí)特大地震影響澳窑,放射性物質(zhì)發(fā)生泄漏斧散。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一照捡、第九天 我趴在偏房一處隱蔽的房頂上張望颅湘。 院中可真熱鬧,春花似錦栗精、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鹿寨。三九已至,卻和暖如春薪夕,著一層夾襖步出監(jiān)牢的瞬間脚草,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工原献, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馏慨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓姑隅,卻偏偏與公主長(zhǎng)得像写隶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讲仰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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