【python學(xué)習(xí)日記】類

類是模板帮孔,而實(shí)例則是根據(jù)類創(chuàng)建的對(duì)象克胳。片面的認(rèn)為它是一個(gè)種類德挣,它是相似特征的抽像恭垦,也就是相似的東西,可以把相似特征的事務(wù)抽象成一個(gè)類格嗅。(事務(wù)可以是具體的物體或行為)

1.類的定義與實(shí)例的創(chuàng)建

class Circle(object):? ?# 創(chuàng)建Circle類番挺,Circle為類名

? pass? ? # 此處可添加屬性和方法

創(chuàng)建兩個(gè)Circle類的實(shí)例:

circle1= Circle()

circle2= Circle()

2.類的實(shí)例屬性與類屬性

實(shí)例屬性可以用于區(qū)分每個(gè)實(shí)例;類屬性是每個(gè)實(shí)例的共有屬性屯掖。實(shí)例屬性每個(gè)實(shí)例各自擁有玄柏,互相獨(dú)立,而類屬性有且只有一份

實(shí)例屬性

circle1.r = 1 # r為實(shí)例屬性

circle2.R= 2?

print(circle1.r)? # 使用 實(shí)例名.屬性名 可以訪問我們的屬性

print(circle2.R)


circle1 = Circle(1) # 創(chuàng)建實(shí)例時(shí)直接給定實(shí)例屬性贴铜,self不算在內(nèi)

circle2 = Circle(2)

print(circle1.r)? # 實(shí)例名.屬性名 訪問屬性

print(circle2.r)? # 我們調(diào)用實(shí)例屬性的名稱就統(tǒng)一了


class Circle(object): # 創(chuàng)建Circle類

? def __init__(self, R):? # 約定成俗這里應(yīng)該使用r粪摘,它與self.r中的r同名

? ? ? self.r = R

circle1 = Circle(1)?

print(circle1.r)? #我們?cè)L問的是小寫r


在創(chuàng)建實(shí)例時(shí)給類初始屬性,當(dāng)創(chuàng)建實(shí)例時(shí)绍坝,__init__()方法被自動(dòng)調(diào)用徘意,就能在此為每個(gè)實(shí)例都統(tǒng)一加上我們需要的屬性

class Circle(object): # 創(chuàng)建Circle類

? def __init__(self, r): # 初始化一個(gè)屬性r(不要忘記self參數(shù),他是類下面所有方法必須的)

? ? ? self.r = r? # 表示給我們將要?jiǎng)?chuàng)建的實(shí)例賦予屬性r賦值

類屬性

在類上綁定屬性轩褐,則所有實(shí)例都可以訪問該類的屬性椎咧,并且所有實(shí)例訪問的類屬性都是同一個(gè)可見,千萬(wàn)不要在實(shí)例上修改類屬性把介,它實(shí)際上并沒有修改類屬性勤讽,而是給實(shí)例綁定了一個(gè)實(shí)例屬性。

class Circle(object):

? pi = 3.14? # 類屬性

? def __init__(self, r):

? ? ? self.r = r

circle1 = Circle(1)

circle2 = Circle(2)

print(circle1.pi) #輸出3.14

Circle.pi = 3.14159? # 通過類名修改類屬性劳澄,所有實(shí)例的類屬性被改變

print(circle1.pi) #輸出3.14159

circle1.pi=3.14111? # 實(shí)際上這里是給circle1創(chuàng)建了一個(gè)與類屬性同名的實(shí)例屬性

print(circle1.pi)? #輸出3.14111 實(shí)例屬性的訪問優(yōu)先級(jí)比類屬性高

print(circle2.pi) #輸出3.14159

del circle1.pi

print(circle1.pi) #輸出3.14159

3.類的實(shí)例方法

在類的內(nèi)部地技,使用 def 關(guān)鍵字來定義一個(gè)方法,與一般函數(shù)定義不同秒拔。類方法必須第一個(gè)參數(shù)為 self, self 代表的是類的實(shí)例(即你還未創(chuàng)建類的實(shí)例)其他參數(shù)和一個(gè)普通函數(shù)是完全一樣莫矗。

class Circle(object):

? pi = 3.14? # 類屬性

? def __init__(self, r):? #特殊的實(shí)例方法

? ? ? self.r = r? # 實(shí)例屬性

? def get_area(self): #求圓的面積的方法

? ? ? return self.r**2 * self.pi

circle1 = Circle(1)

print(circle1.get_area())? # 調(diào)用方法 self不需要傳入?yún)?shù),不要忘記方法后的括號(hào)? 輸出3.14

Circle.pi使用的是類屬性pi砂缩,我們通過創(chuàng)建的實(shí)例去修改pi的值對(duì)它無影響作谚。self.pi為實(shí)例的pi值,我們通過創(chuàng)建的實(shí)例去修改pi的值時(shí)庵芭,由于使用self.pi調(diào)用的是實(shí)例屬性妹懒,所以self.pi是修改后的值。

4.參數(shù)的傳遞圖


參數(shù)的傳遞圖

1和2參數(shù)傳遞給__init__方法中的data參數(shù)双吆;3self參數(shù)指向當(dāng)前實(shí)例自身眨唬,self代表創(chuàng)建的實(shí)例變量ik1或者Kls('arun')

我們不需要傳遞實(shí)例自身給方法会前,Python解釋器自己會(huì)做這些操作的;ik1會(huì)自動(dòng)作為第一個(gè)實(shí)例參數(shù)(self)傳入方法中

5.類中的訪問限制(常用)

屬性的訪問限制匾竿,Python私有屬性

如果有些屬性不希望被外部訪問瓦宜,可以屬性命名時(shí)以雙下劃線開頭;改屬性不能使用原變量名訪問岭妖,使屬性變?yōu)樗接械模▊嗡接校?/p>

__pi = 3.14

通過Circle.__pi與circle1.__pi訪問__pi時(shí) 都會(huì)出現(xiàn)AttributeError異常临庇,證明訪問權(quán)限已被控制;可以通過 Circle._Circle__pi 訪問到__pi 屬性昵慌;以"__xxx__"定義的屬性在Python的類中被稱為特殊屬性

方法的訪問限制假夺,Python私有訪問

同屬性的訪問限制,方法的訪問限制也是在方法名前加雙下劃線(__)斋攀,它也是一種偽私有

def __girth(self): #圓的周長(zhǎng)

? ? ? return 2*self.r * self.__pi

circle1 = Circle(2)

print(circle1.__girth()) # 拋出AttributeError異常

訪問被限制的方法也是 _類名__xx 如circle1._Circle__girth()

6.類中的@classmethod已卷、@staticmethod 裝飾方法

@classmethod 類方法

使用在與類進(jìn)行交互,但不和其實(shí)例進(jìn)行交互的函數(shù)方法上淳蔼。我們不用通過實(shí)例化類就能訪問的方法悼尾。而且@classmethod裝飾的方法不能使用實(shí)例屬性,只能是類屬性肖方。它主要使用在和類進(jìn)行交互,但不和其實(shí)例進(jìn)行交互的函數(shù)方法上未状。只在類中運(yùn)行而不在實(shí)例中運(yùn)行的方法俯画,簡(jiǎn)單示例,讀取私有化類屬性數(shù)據(jù)司草,如下:

class Circle(object):

? __pi = 3.14

? def __init__(self, r):

? ? ? self.r = r

? @classmethod

? def pi(self):

? ? ? return self.__pi

? def area(self):

? ? ? return self.r ** 2 * self.__pi

print(Circle.pi())? # 沒有實(shí)例化 能直接訪問pi() 方法

circle1 = Circle(2)

print(circle1.pi()) # 也可以通過實(shí)例訪問pi()方法


class Date(object):

? day = 0

? month = 0

? year = 0

? def __init__(self, year=0, month=0, day=0):

? ? ? self.day = day

? ? ? self.month = month

? ? ? self.year = year

? @classmethod

? def from_string(cls, date_as_string):

? ? ? year, month, day = date_as_string.split('-')

? ? ? date = cls(year, month, day)

? ? ? return date

date1 = Date.from_string('2017-10-17')

print(date1.year, date1.month, date1.day)


from_string 返回的是Date類的實(shí)例艰垂,所以我們可以通過from_string 實(shí)例化類。

from_string(cls, date_as_string)中cls表示的是類埋虹,它和self類實(shí)例有一定的差別猜憎。類方法中都是使用cls,實(shí)例方法中使用self搔课。

@staticmethod 靜態(tài)方法

使用在有些與類相關(guān)函數(shù)胰柑,但不使用該類或該類的實(shí)例。如更改環(huán)境變量爬泥、修改其他類的屬性等柬讨。做的事與類方法或?qū)嵗椒ㄒ粯印staticmethod 修飾的方法是放在類外的函數(shù)袍啡,我們?yōu)榱朔奖銓⑺苿?dòng)到了類里面踩官,它對(duì)類的運(yùn)行無影響

class Date(object):

? day = 0

? month = 0

? year = 0

? def __init__(self, year=0, month=0, day=0):

? ? ? self.day = day

? ? ? self.month = month

? ? ? self.year = year

? @classmethod

? def from_string(cls, date_as_string):

? ? ? year, month, day = date_as_string.split('-')

? ? ? date = cls(year, month, day)

? ? ? return date

? @staticmethod

? def is_date_valid(date_as_string):? ? ? #用來校驗(yàn)日期的格式是否正確

? ? ? year, month, day = date_as_string.split('-')

? ? ? return int(year) <= 3999 and int(month) <= 12 and int(day) <= 31

date1 = Date.from_string('2012-05-10')

print(date1.year, date1.month, date1.day)

is_date = Date.is_date_valid('2012-09-18')

print(is_date) #返回True

7.property使用

@property將類方法轉(zhuǎn)換為只讀屬性(常用)

將它作為裝飾器來使用,可以將一個(gè)類方法轉(zhuǎn)變成一個(gè)類屬性境输。只能讀不能修改

property重新實(shí)現(xiàn)setter和getter方法(少用)

把一個(gè)getter方法變成屬性蔗牡,只需要加上@property就可以了颖系,如上此時(shí)pi(self)方法,@property本身又創(chuàng)建了另一個(gè)裝飾器@pi.setter辩越,負(fù)責(zé)把一個(gè)setter方法變成屬性賦值嘁扼,于是,將@pi.setter加到pi(self, pi)上区匣,我們就擁有一個(gè)可控的屬性操作偷拔。

class Circle(object):

? __pi = 3.14

? def __init__(self, r):

? ? ? self.r = r

? @property

? def pi(self):

? ? ? return self.__pi

? @pi.setter

? def pi(self, pi):

? ? ? Circle.__pi = pi

circle1 = Circle(2)

circle1.pi = 3.14? # 設(shè)置 pi的值

print(circle1.pi)? # 訪問 pi的值

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市亏钩,隨后出現(xiàn)的幾起案子莲绰,更是在濱河造成了極大的恐慌,老刑警劉巖姑丑,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛤签,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡栅哀,警方通過查閱死者的電腦和手機(jī)震肮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來留拾,“玉大人戳晌,你說我怎么就攤上這事〕杖幔” “怎么了沦偎?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)咳蔚。 經(jīng)常有香客問我豪嚎,道長(zhǎng),這世上最難降的妖魔是什么谈火? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任侈询,我火速辦了婚禮,結(jié)果婚禮上糯耍,老公的妹妹穿的比我還像新娘扔字。我一直安慰自己,他們只是感情好温技,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布啦租。 她就那樣靜靜地躺著,像睡著了一般荒揣。 火紅的嫁衣襯著肌膚如雪篷角。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天系任,我揣著相機(jī)與錄音恳蹲,去河邊找鬼虐块。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嘉蕾,可吹牛的內(nèi)容都是我干的贺奠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼错忱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼儡率!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起以清,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤儿普,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后掷倔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眉孩,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年勒葱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浪汪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凛虽,死狀恐怖死遭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凯旋,我是刑警寧澤殃姓,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站瓦阐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏篷牌。R本人自食惡果不足惜睡蟋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枷颊。 院中可真熱鬧戳杀,春花似錦、人聲如沸夭苗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)题造。三九已至傍菇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間界赔,已是汗流浹背丢习。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工牵触, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咐低。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓揽思,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親见擦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钉汗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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