Python學(xué)習(xí)筆記7—類

面向?qū)ο缶幊淌亲钣行У能浖帉懛椒ㄖ怀T诿嫦驅(qū)ο缶幊讨欣床憔帉懕硎粳F(xiàn)實(shí)世界中的事物和情景的類汰扭,并基于這些類來創(chuàng)建對象。編寫類時福铅,定義一個大類對象都有的通用行為萝毛。基于類創(chuàng)建對象時滑黔,每個對象都自動具備這種通用行為笆包,然后可根據(jù)需要賦予每個對象獨(dú)特的個性。根據(jù)類來創(chuàng)建對象被稱為實(shí)例化略荡,這讓你能夠使用類的示例庵佣。

一、創(chuàng)建和使用類

使用類幾乎可以模擬任何東西汛兜。

1巴粪、創(chuàng)建類

dog.py

class Dog():
    """一次模擬小狗的簡單測試"""
    def __init__(self,name,age):
        """初始化屬性name和age"""
        self.name = name
        self.age = age

    def sit(self):
        """模擬小狗被命令時蹲下"""
        print(self.name.title() + " is now sitting."

注:

  • 根據(jù)約定,首字母大寫的名稱指的是類序无,這個類定義中的括號是空的验毡,因?yàn)槲覀円獜目瞻讋?chuàng)建這個類。
  • 三引號引起來的是文檔字符串帝嗡,對這個類的功能進(jìn)行描述晶通。
  • 方法 __init__() 是一個特殊的方法,每當(dāng)你根據(jù)類創(chuàng)建新的實(shí)例時哟玷,Python都會自動運(yùn)行它狮辽。開頭和結(jié)尾各有兩個下劃線,旨在避免Python默認(rèn)方法與普通方法發(fā)送名稱沖突巢寡。形參self必不可少喉脖,還必須位于其他形參的前面
  • self為前綴的變量都可供類中的所有方法使用抑月。

在Python 2.7中國創(chuàng)建類時树叽,應(yīng)在括號內(nèi)包含單詞object

class ClassName(object):

2、根據(jù)類創(chuàng)建實(shí)例

class Dog():
    --snip--

my_dog = Dog('Bob',2)
print("My dog's name is " + my_dog.name.title() +".")

約定:首字母大寫的名稱指的是類谦絮,小寫的名稱指的是根據(jù)類創(chuàng)建的實(shí)例题诵。

① 訪問屬性(句點(diǎn)表示法)

my_dog.name

② 調(diào)用方法(句點(diǎn)表示法)

my_dog.sit()

③ 創(chuàng)建多個實(shí)例

my_dog = Dog('Bob',2)
your_dog = Dog('Mei',3)

二洁仗、使用類和實(shí)例

類編寫好之后,你的大部分時間都將花在使用根據(jù)類創(chuàng)建的實(shí)例上性锭。你需要執(zhí)行的一個重要任務(wù)是修改實(shí)例的屬性赠潦,可以直接修改實(shí)例的屬性,也也可以編寫方法以特定的方式進(jìn)行修改草冈。

1她奥、給屬性指定默認(rèn)值

class Dog():
    """一次模擬小狗的簡單測試"""
    def __init__(self,name,age):
        """初始化屬性name和age"""
        self.name = name
        self.age = age
        self.color = 'yellow'

    def sit(self):
        """模擬小狗被命令時蹲下"""
        print(self.name.title() + " is now sitting."

2、修改屬性的值

① 直接修改屬性的值

要修改屬性的值怎棱,最簡單的方式時通過實(shí)例直接訪問它哩俭,然后修改屬性值。

my_dog.color = 'red'

② 通過方法修改屬性的值

將要修改的值傳遞給一個方法蹄殃,由它在內(nèi)部進(jìn)行修改携茂。

class Dog():
    --snip--

    def update_color(self,color):
        """修改寵物的顏色"""
        self.color = 'color'

③ 通過方法對屬性的值進(jìn)行遞增

有時候需要將屬性值遞增特定的量,而不是將其設(shè)置為全新的值诅岩。

三讳苦、繼承

編寫類時,并非總是要從空白開始吩谦。如果你要編寫的類是一個現(xiàn)成類的特殊版本鸳谜,可使用繼承。一個類繼承另一個類式廷,它將自動獲得另一個類的所有屬性和方法咐扭。原來的類稱為父類(超類),新類稱為子類滑废。子類繼承了其父類的所有屬性和方法蝗肪,同時還可以定義自己的屬性和方法。

1蠕趁、子類的方法 __ init __ ()

class Dog():
    --snip--

class BabyDog(Dog):
    """嬰兒狗的特殊之處"""
    
    def __init__(self,name,age):
        """初始化父類的屬性"""
        super().__init__(name,age)

注:

  • 創(chuàng)建子類時薛闪,父類必須包含在當(dāng)前文件中,且位于子類的前面俺陋。
  • 定義子類時豁延,必須在括號內(nèi)指定父類的名稱。方法__init__()接受創(chuàng)建父類實(shí)例所需的信息腊状。
  • super()是一個特殊的函數(shù)诱咏,幫助Python將父類和子類關(guān)聯(lián)起來。

2缴挖、python 2.7中的繼承

  • 定義父類時在括號內(nèi)指定object袋狞;
  • 函數(shù)super()需要兩個實(shí)參:子類名和對象self。
class Dog(object):
    def __init__(self,name,age):
        --snip--

class BabyDog(Dog):
    def __init__(self,name,age):
        super(Dog,self).__init__(name,age)
        --snip--

3、給子類定義屬性和方法

class Dog():
    --snip--

class BabyDog(Dog):
    """嬰兒狗的特殊之處"""
    
    def __init__(self,name,age,mother_name):
        """初始化父類的屬性硕并,再初始化嬰兒狗的特有屬性"""
        super().__init__(name,age)
        self.mother_name = mother_name

    def show_mother_name(self,mother_name):
        """打印嬰兒狗的麻麻的名字"""
        print("This baby dog's name is " + self.name +" and it's mother is " 
              + self.mother_name + ".")

4法焰、重寫父類的方法

對于父類的方法,只要它不符合子類模擬的實(shí)物的行為倔毙,都可對其進(jìn)行重寫。為此乙濒,可在子類中定義一個與要重寫父類方法同名的方法陕赃。這樣,Python將不會考慮這個父類方法颁股,而只關(guān)注你在子類中定義的響應(yīng)方法么库。

5、將實(shí)例用作屬性

使用代碼模擬實(shí)物時甘有,你可能會發(fā)現(xiàn)自己給類添加的細(xì)節(jié)越來越多:屬性和方法清單以及文件都越來越長诉儒。在這種情況下,可能需要將類的一部分作為一個獨(dú)立的類提取出來亏掀〕婪矗可將大型類拆分成多個協(xié)同工作的小類。

class Car():
    --snip--

class Battery():
      --snip-

class ElectricCar(Car):
    """電動汽車的獨(dú)特之處"""
    def __init__(self,make,modle,year):
        super().__init__(make,modle,year)
        self.battery = Battery()

ElectricCar類中滤愕,添加了一個名為self.battery的屬性温算,這行代碼讓Python創(chuàng)建一個新的Battery實(shí)例,并將該實(shí)例存儲在屬性self.battery中间影。每當(dāng)方法__init__()被調(diào)用時注竿,都將執(zhí)行該操作。因此現(xiàn)在每個ElectricCar實(shí)例都包含一個自動創(chuàng)建的Battery實(shí)例魂贬。

四巩割、導(dǎo)入類

隨著你不斷地給類添加功能,文件可能變得很長付燥,為此宣谈,可將類存儲在模塊中,然后在主程序中導(dǎo)入所需的模塊机蔗。

1蒲祈、導(dǎo)入單個類

dog.py

"""一個可用于表示狗的類"""

class Dog():
    --snip--

注:三引號引起來的是模塊級文檔字符串,對該模塊的內(nèi)容進(jìn)行簡單的描述萝嘁。
my_dog.py

from dog import Dog

my_dog = Dog('bob',2)

2梆掸、在一個模塊中存儲多個類

雖然同一個模塊中的類之間應(yīng)存在某種相關(guān)性,但可根據(jù)需要在一個模塊中存儲任意數(shù)量的類牙言。
car.py

"""一組用于表示燃油汽車和電動汽車的類"""

class Car():
    --snip--

class Battery():
    --snip--

class ElectricCar(Car):
    --snip--

3酸钦、從一個模塊中導(dǎo)入多個類

my_cars.py

from car import Car,ElectricCar

4、導(dǎo)入整個模塊

導(dǎo)入整個模塊咱枉,再使用句點(diǎn)表示法訪問需要的類卑硫。由于創(chuàng)建類實(shí)例的代碼都包含模塊名徒恋,因此不會與當(dāng)前文件使用的任何名稱發(fā)生沖突。

import car

my_beetle = car.Car('volkswagen','beetle',2016)
my_tesla = car.ElectricCar('tesla','roadster',2017)

5欢伏、導(dǎo)入模塊中的所有類

from module_name import *

但是入挣,不推薦使用這種導(dǎo)入方法。

6硝拧、在一個模塊中導(dǎo)入另一個模塊

有時候需要將類分散到多個模塊中径筏,一面模塊過大,或在同一個模塊中國存儲不相關(guān)的類障陶。此時滋恬,可能一個模塊的類依賴另一個模塊中的類。
electric_car.py

"""一組可用來表示電動汽車的類"""

from car import Car

class ElectricCar(Car):
    --snip--

car.py

"""一個可用來表示汽車的類"""
class Car():
    --snip--

my_cars.py

from car import Car 
from electric_car import ElectricCar

--snip--

五抱究、類編碼風(fēng)格

  • 類名應(yīng)采用駝峰命名法恢氯。即將類名中的每個單詞的首字母都大寫,而不使用下劃線鼓寺。實(shí)例名和模塊名都采用小寫格式勋拟,并在單詞之間加上下劃線。
  • 對于每個類侄刽,都應(yīng)緊跟在類定義后面包含一個文檔字符串指黎。這種文檔字符串簡要地描述類的功能,并遵循編寫函數(shù)的文檔字符串時采用的格式約定州丹。每個模塊也都應(yīng)該包含一個文檔字符串醋安,對其中的類可用于做什么進(jìn)行描述。
  • 可使用空行來組織代碼墓毒,但不要濫用吓揪。在類中,可使用一個空行來分隔方法所计;而在模塊中柠辞,可使用兩個空行來分隔類。
  • 需要同時導(dǎo)入標(biāo)準(zhǔn)庫中的模塊和你編寫的模塊時,先編寫導(dǎo)入標(biāo)準(zhǔn)庫模塊的import語句,再添加一個空行赶舆,然后編寫導(dǎo)入你自己編寫的模塊的import語句。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焙格,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子夷都,更是在濱河造成了極大的恐慌眷唉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冬阳,居然都是意外死亡蛤虐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門肝陪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驳庭,“玉大人,你說我怎么就攤上這事见坑∪侣樱” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵荞驴,是天一觀的道長。 經(jīng)常有香客問我贯城,道長熊楼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任能犯,我火速辦了婚禮鲫骗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踩晶。我一直安慰自己执泰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布渡蜻。 她就那樣靜靜地躺著术吝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茸苇。 梳的紋絲不亂的頭發(fā)上排苍,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音学密,去河邊找鬼淘衙。 笑死,一個胖子當(dāng)著我的面吹牛腻暮,可吹牛的內(nèi)容都是我干的彤守。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼哭靖,長吁一口氣:“原來是場噩夢啊……” “哼具垫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起款青,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤做修,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饰及,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔗坯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了燎含。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宾濒。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屏箍,靈堂內(nèi)的尸體忽然破棺而出绘梦,到底是詐尸還是另有隱情,我是刑警寧澤赴魁,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布卸奉,位于F島的核電站,受9級特大地震影響颖御,放射性物質(zhì)發(fā)生泄漏榄棵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一潘拱、第九天 我趴在偏房一處隱蔽的房頂上張望疹鳄。 院中可真熱鬧,春花似錦芦岂、人聲如沸瘪弓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腺怯。三九已至,卻和暖如春弛随,著一層夾襖步出監(jiān)牢的瞬間瓢喉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工舀透, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栓票,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓愕够,卻偏偏與公主長得像走贪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惑芭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理坠狡,服務(wù)發(fā)現(xiàn),斷路器遂跟,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 要點(diǎn): 函數(shù)式編程:注意不是“函數(shù)編程”逃沿,多了一個“式” 模塊:如何使用模塊 面向?qū)ο缶幊蹋好嫦驅(qū)ο蟮母拍钣ざ伞傩浴?..
    victorsungo閱讀 1,501評論 0 6
  • 不要活的太認(rèn)真, 當(dāng)別人不把你當(dāng)回事時凯亮,你也不需要太把別人當(dāng)回事边臼,尊重是相互的。 動手動腦是最好的老師...
    晴冰閱讀 248評論 0 0
  • 這個社會一定要功利嗎 是的 只是你懶 只是你麻木 人來人往皆為利 有什么懷疑的假消!
    塵埃木木閱讀 82評論 0 0
  • 我要把喜歡柠并,寫在水面上。 那樣富拗,別人就看不到波瀾了臼予。如果我哭了,一個又一個晚上啃沪。 也沒有人會知道淚水流向了哪里粘拾。 ...
    雨落f閱讀 327評論 0 1