python面向?qū)ο缶幊?/h1>

面向?qū)ο缶幊?/h3>

類和實例

來自:

廖雪峰python

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431864715651c99511036d884cf1b399e65ae0d27f7e000


面向?qū)ο笞钪匾母拍罹褪穷悾–lass)和實例(Instance),必須牢記類是抽象的模板铺遂,比如Student類驹愚,而實例是根據(jù)類創(chuàng)建出來的一個個具體的“對象”心铃,每個對象都擁有相同的方法捣郊,但各自的數(shù)據(jù)可能不同训裆。

由于類可以起到模板的作用抱慌,因此霜威,可以在創(chuàng)建實例的時候酪刀,把一些我們認(rèn)為必須綁定的屬性強(qiáng)制填寫進(jìn)去粹舵。通過定義一個特殊的__init__方法,在創(chuàng)建實例的時候蓖宦,就把name齐婴,score等屬性綁上去:

class Student(object):

    def __init__(self, name, score):
        self.name = name #python不用提前聲明類中的對象
        self.score = score
    def print_score(self):
        print('%s: %s' % (self.name, self.score))

注意:特殊方法“init”前后分別有兩個下劃線!3砻柠偶!

注意到__init__方法的第一個參數(shù)永遠(yuǎn)是self情妖,表示創(chuàng)建的實例本身,因此诱担,在__init__方法內(nèi)部毡证,就可以把各種屬性綁定到self,因為self就指向創(chuàng)建的實例本身蔫仙。

有了__init__方法料睛,在創(chuàng)建實例的時候,就不能傳入空的參數(shù)了摇邦,必須傳入與__init__方法匹配的參數(shù)恤煞,但self不需要傳,Python解釋器自己會把實例變量傳進(jìn)去:

>>> bart = Student('Bart Simpson', 59) #python新建施籍,不用new
>>> bart.name
'Bart Simpson'
>>> bart.score
59

和普通的函數(shù)相比居扒,在類中定義的函數(shù)只有一點不同丑慎,就是第一個參數(shù)永遠(yuǎn)是實例變量self喜喂,并且,調(diào)用時竿裂,不用傳遞該參數(shù)玉吁。除此之外,類的方法和普通函數(shù)沒有什么區(qū)別腻异,所以进副,你仍然可以用默認(rèn)參數(shù)、可變參數(shù)捂掰、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù)敢会。

訪問限制

如果要讓內(nèi)部屬性不被外部訪問曾沈,可以把屬性的名稱前加上兩個下劃線__这嚣,在Python中,實例的變量名如果以__開頭塞俱,就變成了一個私有變量(private)姐帚,只有內(nèi)部可以訪問,外部不能訪問障涯,所以罐旗,我們把Student類改一改:

class Student(object):

    def __init__(self, name, score):
        self.__name = name#python不用提前聲明變量
        self.__score = score

    def print_score(self):
        print('%s: %s' % (self.__name, self.__score))

需要注意的是,在Python中唯蝶,變量名類似__xxx__的九秀,也就是以雙下劃線開頭,并且以雙下劃線結(jié)尾的粘我,是特殊變量鼓蜒,特殊變量是可以直接訪問的痹换,不是private變量,所以都弹,不能用__name__娇豫、__score__這樣的變量名。

有些時候畅厢,你會看到以一個下劃線開頭的實例變量名冯痢,比如_name,這樣的實例變量外部是可以訪問的框杜,但是浦楣,按照約定俗成的規(guī)定,當(dāng)你看到這樣的變量時咪辱,意思就是椒振,“雖然我可以被訪問,但是梧乘,請把我視為私有變量澎迎,不要隨意訪問”。

雙下劃線開的實例變量是不是一定不能從外部訪問呢选调?其實也不是夹供。不能直接訪問__name是因為Python解釋器對外把__name變量改成了_Student__name,所以仁堪,仍然可以通過_Student__name來訪問__name變量:

>>> bart._Student__name
'Bart Simpson'

但是強(qiáng)烈建議你不要這么干哮洽,因為不同版本的Python解釋器可能會把__name改成不同的變量名。

總的來說就是弦聂,Python本身沒有任何機(jī)制阻止你干壞事鸟辅,一切全靠自覺。

summary:遇到對應(yīng)的私有變量莺葫,還是用get set方法吧

python之繼承

#注意python中的繼承是如何寫的
class Animal(object):
    def run(self):
        print('Animal is running...')
class Dog(Animal):

    def run(self):
        print('Dog is running...')

class Cat(Animal):

    def run(self):
        print('Cat is running...')

當(dāng)子類和父類都存在相同的run()方法時匪凉,我們說,子類的run()覆蓋了父類的run()捺檬,在代碼運行的時候再层,總是會調(diào)用子類的run()。這樣堡纬,我們就獲得了繼承的另一個好處:多態(tài)聂受。

在繼承關(guān)系中,如果一個實例的數(shù)據(jù)類型是某個子類烤镐,那它的數(shù)據(jù)類型也可以被看做是父類蛋济。但是,反過來就不行

如何獲取對象信息

1.type-得到對象的類型

基本類型都可以用type()判斷:

>>> type(123)
<class 'int'>
>>> type('str')
<class 'str'>
>>> type(None)
<type(None) 'NoneType'>

如果一個變量指向函數(shù)或者類炮叶,也可以用type()判斷:

>>> type(abs)
<class 'builtin_function_or_method'>
>>> type(a)
<class '__main__.Animal'>

但是type()函數(shù)返回的是什么類型呢碗旅?它返回對應(yīng)的Class類型鹊杖。如果我們要在if語句中判斷,就需要比較兩個變量的type類型是否相同:

>>> type(123)==type(456)
True
>>> type(123)==int
True
>>> type('abc')==type('123')
True
>>> type('abc')==str
True
>>> type('abc')==type(123)
False

判斷基本數(shù)據(jù)類型可以直接寫int扛芽,str等骂蓖,但如果要判斷一個對象是否是函數(shù)怎么辦?可以使用types模塊中定義的常量:

>>> 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

2.instance

那么川尖,isinstance()就可以告訴我們登下,一個對象是否是某種類型。先創(chuàng)建3種類型的對象:

>>> a = Animal()
>>> d = Dog()
>>> h = Husky()

然后叮喳,判斷:

>>> isinstance(h, Husky)
True

沒有問題被芳,因為h變量指向的就是Husky對象。

再判斷:

>>> isinstance(h, Dog)
True

h雖然自身是Husky類型馍悟,但由于Husky是從Dog繼承下來的畔濒,所以,h也還是Dog類型锣咒。換句話說侵状,isinstance()判斷的是一個對象是否是該類型本身,或者位于該類型的父繼承鏈上毅整。

能用type()判斷的基本類型也可以用isinstance()判斷:

>>> isinstance('a', str)
True
>>> isinstance(123, int)
True
>>> isinstance(b'a', bytes)
True

并且還可以判斷一個變量是否是某些類型中的一種趣兄,比如下面的代碼就可以判斷是否是list或者tuple:

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

總是優(yōu)先使用isinstance()判斷類型,可以將指定類型及其子類“一網(wǎng)打盡”悼嫉。

3.dir-獲取一個對象內(nèi)的信息

如果要獲得一個對象的所有屬性和方法艇潭,可以使用dir()函數(shù),它返回一個包含字符串的list戏蔑,比如蹋凝,獲得一個str對象的所有屬性和方法:

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

類似__xxx__的屬性和方法在Python中都是有特殊用途的,比如__len__方法返回長度总棵。在Python中鳍寂,如果你調(diào)用len()函數(shù)試圖獲取一個對象的長度,實際上彻舰,在len()函數(shù)內(nèi)部伐割,它自動去調(diào)用該對象的__len__()方法,所以刃唤,下面的代碼是等價的:

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

可以通過函數(shù)直接操縱對象

實例屬性&類屬性

給實例綁定屬性的方法是通過實例變量,或者通過self變量

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

s = Student('Bob')
s.score = 90

但是白群,如果Student類本身需要綁定一個屬性呢尚胞?可以直接在class中定義屬性,這種屬性是類屬性帜慢,歸Student類所有:

class Student(object):
    name = 'Student' #所以在python中笼裳,提前聲明的非self的變量是類變量

**在編寫程序的時候唯卖,千萬不要對實例屬性和類屬性使用相同的名字,因為相同名稱的實例屬性將屏蔽掉類屬性躬柬,但是當(dāng)你刪除實例屬性后拜轨,再使用相同的名稱,訪問到的將是類屬性允青。 **

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末橄碾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子颠锉,更是在濱河造成了極大的恐慌法牲,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琼掠,死亡現(xiàn)場離奇詭異拒垃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瓷蛙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門悼瓮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人艰猬,你說我怎么就攤上這事谤牡。” “怎么了姥宝?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵翅萤,是天一觀的道長。 經(jīng)常有香客問我腊满,道長套么,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任碳蛋,我火速辦了婚禮胚泌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肃弟。我一直安慰自己玷室,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布笤受。 她就那樣靜靜地躺著穷缤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪箩兽。 梳的紋絲不亂的頭發(fā)上津肛,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機(jī)與錄音汗贫,去河邊找鬼身坐。 笑死秸脱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的部蛇。 我是一名探鬼主播摊唇,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涯鲁!你這毒婦竟也來了巷查?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤撮竿,失蹤者是張志新(化名)和其女友劉穎吮便,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幢踏,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡髓需,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了房蝉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片僚匆。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搭幻,靈堂內(nèi)的尸體忽然破棺而出咧擂,到底是詐尸還是另有隱情,我是刑警寧澤檀蹋,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布松申,位于F島的核電站,受9級特大地震影響俯逾,放射性物質(zhì)發(fā)生泄漏贸桶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一桌肴、第九天 我趴在偏房一處隱蔽的房頂上張望皇筛。 院中可真熱鬧,春花似錦坠七、人聲如沸水醋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拄踪。三九已至,卻和暖如春悉稠,著一層夾襖步出監(jiān)牢的瞬間宫蛆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工的猛, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留耀盗,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓卦尊,卻偏偏與公主長得像叛拷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子岂却,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355