面向?qū)ο蟮姆庋b 方法重載

數(shù)據(jù)封裝

?類型封裝的步驟

1. 抽象一個(gè)類型踊跟,完成類的定義

2. 使用__slots__魔法屬性滥壕,限制當(dāng)前類的屬性列表

3. 所有屬性私有化

4. 給每個(gè)屬性,提供set/get方法

備注:關(guān)于擴(kuò)展屬性(就是創(chuàng)建好對(duì)象之后增加的屬性)昌屉,主要是預(yù)留下來丸凭,給共享的數(shù)據(jù)使用的

如果對(duì)象中福扬,有需要共享的數(shù)據(jù)腕铸,可以選擇使用這樣的屬性。


面向?qū)ο缶幊痰囊粋€(gè)重要特點(diǎn)就是數(shù)據(jù)封裝铛碑。在上面的Student類中狠裹,每個(gè)實(shí)例就擁有各自的name和score這些數(shù)據(jù)。我們可以通過函數(shù)來訪問這些數(shù)據(jù)汽烦,比如打印一個(gè)學(xué)生的成績(jī):

>>>def print_score(std):..

.print('%s: %s'% (std.name, std.score))...

>>>print_score(bart)Bart Simpson:59

但是涛菠,既然Student實(shí)例本身就擁有這些數(shù)據(jù),要訪問這些數(shù)據(jù)撇吞,就沒有必要從外面的函數(shù)去訪問俗冻,可以直接在Student類的內(nèi)部定義訪問數(shù)據(jù)的函數(shù),這樣牍颈,就把“數(shù)據(jù)”給封裝起來了迄薄。這些封裝數(shù)據(jù)的函數(shù)是和Student類本身是關(guān)聯(lián)起來的,我們稱之為類的方法:

class Student(object):

def__init__(self, name, score):

self.name = name? ? ? ??

self.score = score

def print_score(self):

print('%s: %s'% (self.name, self.score))

要定義一個(gè)方法煮岁,除了第一個(gè)參數(shù)是self外讥蔽,其他和普通函數(shù)一樣。要調(diào)用一個(gè)方法画机,只需要在實(shí)例變量上直接調(diào)用冶伞,除了self不用傳遞,其他參數(shù)正常傳入:

>>>bart.print_score()

Bart Simpson:59

這樣一來步氏,我們從外部看Student類响禽,就只需要知道,創(chuàng)建實(shí)例需要給出name和score荚醒,而如何打印芋类,都是在Student類的內(nèi)部定義的,這些數(shù)據(jù)和邏輯被“封裝”起來了腌且,調(diào)用很容易梗肝,但卻不用知道內(nèi)部實(shí)現(xiàn)的細(xì)節(jié)。

封裝的另一個(gè)好處是可以給Student類增加新的方法铺董,比如get_grade:

class Student(object)

def get_grade(self):

if self.score >=90:

return'A'?

?elif ?self.score >=60:

return'B'

else:

? ? ? ?return'C'

同樣的巫击,get_grade方法可以直接在實(shí)例變量上調(diào)用,不需要知道內(nèi)部實(shí)現(xiàn)細(xì)節(jié):

>>>bart.get_grade()'C'

小結(jié)

類是創(chuàng)建實(shí)例的模板精续,而實(shí)例則是一個(gè)一個(gè)具體的對(duì)象坝锰,各個(gè)實(shí)例擁有的數(shù)據(jù)都互相獨(dú)立,互不影響重付;

方法就是與實(shí)例綁定的函數(shù)顷级,和普通函數(shù)不同,方法可以直接訪問實(shí)例的數(shù)據(jù)确垫;

通過在實(shí)例上調(diào)用方法弓颈,我們就直接操作了對(duì)象內(nèi)部的數(shù)據(jù)帽芽,但無需知道方法內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。

和靜態(tài)語言不同翔冀,Python允許對(duì)實(shí)例變量綁定任何數(shù)據(jù)导街,也就是說,對(duì)于兩個(gè)實(shí)例變量纤子,雖然它們都是同一個(gè)類的不同實(shí)例搬瑰,但擁有的變量名稱都可能不同:

>>> bart = Student('Bart Simpson', 59)

>>> lisa = Student('Lisa Simpson', 87)

>>> bart.age = 8

>>> ?bart.age

8

>>> ?lisa.age

Traceback (most recent call last): ?

? File "<stdin>," line 1,? in ?<module>

AttributeError :Student' object has no attribute 'age'

方法重載

在同一個(gè)類中,出現(xiàn)了兩個(gè)或者兩個(gè)以上同名函數(shù)/方法:方法重載

self.__nickname=nickname

@property

def username(self):

return self.__username

@username.setter

defusername(self,un):

self.__username=un


def password(self):

return self.__password


def password(self,pa):

self.__password=pa


def nickname(self):

return self.__nickname


def nickname(self,ni):

self.__nickname=ni

對(duì)象的屬性

?給創(chuàng)建的對(duì)象控硼,添加屬性

?如果對(duì)象的屬性泽论,可以任意自定義的話,就會(huì)造成非常大的困擾:對(duì)象變成了變形金剛

項(xiàng)目往往時(shí)多個(gè)人協(xié)同開發(fā)的卡乾,開發(fā)的過程中翼悴,每個(gè)人給對(duì)象添加的屬性名稱和屬性個(gè)數(shù)就可能不一致!

class Users:

def__init__(self,name,age):

self.__name=name

self.__age=age

def get_name(self):

return self.__name

def get_age(self):

return self.__age

#def __str__(self):

#return"姓名:%s,年齡:%s"%(self.__name,self.__age)

u=Users("湯姆",20)

print(u)

u.username="admain"

u.password="123"

u.nickname="nini"

print(u.username,u.password,u.nickname,u.get_name(),u.get_age())

運(yùn)行結(jié)果

<__main__.Users object at 0x01E90670>

admain 123 nini 湯姆 20

對(duì)象屬性的限制

為了避免幔妨,對(duì)象屬性被濫用(創(chuàng)建對(duì)象后抄瓦,給對(duì)象增加屬性)

要給對(duì)象的屬性 添加限制 限制對(duì)象只能擁有哪些屬性 魔法屬性__slots__

class Users:

設(shè)置當(dāng)前類創(chuàng)建的對(duì)象 可能出現(xiàn)的屬性列表 列表中沒有出現(xiàn)的屬性不允許使用

__slots__=["__username","__password","__nickname","__sex","__age"]

def__init__(self,username,password,nickname,sex,age):

self.__username=username

self.__password=password

self.__nickname=nickname

self.__sex=sex

self.__age=age

def__str__(self):

return"用戶名:%s,密碼:%s,昵稱:%s,性別:%s,年齡:%s"%(\

self.__username,self.__password,self.__nickname,self.__sex,self.__age)

u=Users("123","123","marre","女","12")

u.address="駐馬店"

print(u)

運(yùn)行結(jié)果

u.address="駐馬店"

AttributeError: 'Users' object has no attribute 'address'

把u.address="駐馬店"注釋掉得到的結(jié)果

用戶名:123,密碼:123,昵稱:marre,性別:女,年齡:12

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市陶冷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毯辅,老刑警劉巖埂伦,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異思恐,居然都是意外死亡沾谜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門胀莹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來基跑,“玉大人,你說我怎么就攤上這事描焰∠狈瘢” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵荆秦,是天一觀的道長(zhǎng)篱竭。 經(jīng)常有香客問我,道長(zhǎng)步绸,這世上最難降的妖魔是什么掺逼? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮瓤介,結(jié)果婚禮上吕喘,老公的妹妹穿的比我還像新娘赘那。我一直安慰自己,他們只是感情好氯质,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布募舟。 她就那樣靜靜地躺著,像睡著了一般病梢。 火紅的嫁衣襯著肌膚如雪胃珍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天蜓陌,我揣著相機(jī)與錄音觅彰,去河邊找鬼。 笑死钮热,一個(gè)胖子當(dāng)著我的面吹牛填抬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隧期,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼飒责,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了仆潮?” 一聲冷哼從身側(cè)響起宏蛉,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎性置,沒想到半個(gè)月后拾并,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹏浅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年嗅义,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隐砸。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡之碗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出季希,到底是詐尸還是另有隱情褪那,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布式塌,位于F島的核電站武通,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏珊搀。R本人自食惡果不足惜冶忱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望境析。 院中可真熱鬧囚枪,春花似錦派诬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至括勺,卻和暖如春缆八,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疾捍。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工奈辰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乱豆。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓奖恰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親宛裕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瑟啃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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