Python面向?qū)ο缶幊?二)-訪問限制&繼承和多態(tài)

訪問限制

Class內(nèi)部,可以有屬性和方法,外部代碼可以通過直接調(diào)用實例變量的方法來操作數(shù)據(jù)效五。隱藏了內(nèi)部的復(fù)雜邏輯。

但是炉峰,外部代碼還是可以自由的修改一個實例的屬性畏妖。若要讓內(nèi)部屬性不被外部訪問,在屬性的名稱前加上__讲冠,實例的變量名若以__開頭瓜客,就編程了一個私有變量,只有內(nèi)部可以訪問竿开,外部不能訪問:

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

外部訪問時谱仪,實例變量.__name實例變量.__score無法被訪問。確保了外部代碼不能隨意修改內(nèi)部的狀態(tài)否彩。

新增方法疯攒,給外部代碼訪問的讀取權(quán)限。

class Student(object):
    ...
    def get_name(self):
        return self.__name
    def get_score(self):
        return self.__score

新增發(fā)發(fā)列荔,給外部代碼訪問的寫權(quán)限敬尺。

class Student(object):
    ...
    def set_name(self, name):
        self.__name = name
    def set_score(self, score):
        self.__score = score

注意:在Python中,變量名類似__xx__的贴浙,也就是雙下劃線開頭及結(jié)尾的砂吞,是特殊變量,可以直接訪問崎溃,不是private變量蜻直。

有時,會有單下劃線開頭的實例變量名,是可以直接訪問的概而,但當看到這樣的變量時呼巷,雖然可以被訪問,但是赎瑰,請視為私有變量王悍,不要隨意訪問。

雙下劃線開頭的實例變量也可以直接訪問餐曼,不能直接訪問的原因是因為Python解釋器對外把__xx變量改成了_Class__xx压储,所有,仍然可以通過_Class__xx來訪問__xx變量源譬。

但是渠脉,強烈建議不要這么干,因為不同版本的Python解釋器可能會把__xx改成不同的變量名瓶佳。總的來說鳞青,Python本身沒有任何機制阻止你干壞事霸饲,一切靠自覺。

繼承和多態(tài)

在OOP程序設(shè)計中臂拓,當定義一個class的時候厚脉,可以從某額現(xiàn)有的class繼承,新的class稱為子類(Sub class)胶惰,而被繼承的class稱為基類 傻工、父類、超類(Base class孵滞、Super class)中捆。
如,編寫一個動物的classAnimal坊饶,有一個run()方法可以打有刮薄:

class Animal(object):
    def run(self):
        print('Animal is running...')

編寫DogCat類匿级,繼承Animal類:

class Dog(Animal):
    pass
class Cat(Animal):
    pass

對于DogCat來說蟋滴,Animal就是它們的父類。對于Animal來說痘绎,DogCat就是它的子類津函。

繼承:1. 子類獲得了父類的全部功能,即DogCat已經(jīng)自動擁有了run()方法孤页。

dog = Dog()
dog.run()    # Animal is running...
cat = Cat()
cat.run()    # Animal is running...

繼承:2. 當子類和父類存在相同的run()方法時尔苦,子類的run()會覆蓋父類的run(),代碼運行時,總是會調(diào)用子類的run()蕉堰。即:多態(tài)凌净。

多態(tài):定義三個數(shù)據(jù)類型,list屋讶、Animal冰寻、Dog

a = list()
b = Animal()
c = Dog()
print(isinstance(a, list))    # True
print(isinstance(b, Animal))    # True
print(isinstance(c, Dog))    # True
print(isinstance(c, Animal))    # True

從上述結(jié)果可知,實例變量c既是Animal皿渗,又是Dog斩芭。

因為Dog時從Animal繼承下來的,當我們創(chuàng)建一個Dog的實例時乐疆,它時一個Dog沒錯划乖,但同時也是一個AnimalDog本來就是Animal的一種挤土。

但是琴庵,反過來的時候就不可以了。即:

d = Animal()
print(isinstance(d, Dog))    # False
靜態(tài)語言vs動態(tài)語言

對于靜態(tài)語言(例JAVA)來說仰美,若傳入類型為Animal迷殿,則傳入的對象必須時Animal或它的子類,否則無法調(diào)用run()方法咖杂。

對于Python這樣的動態(tài)語言來說庆寺,則不一定需要傳入Animal類型,只需要保證傳入的對象有一個run()方法即可诉字。

不管什么類型的對象都能接受懦尝,并且只要這個對象有run()都可以輸出。作者想表達的意思應(yīng)該是多態(tài)壤圃,如果傳進去的對象自身沒有定義run()陵霉,就會調(diào)用基類的run(),如果子對象有run()埃唯,就會調(diào)用自身的run()撩匕,也就實現(xiàn)了多態(tài)。但是所說的鴨子什么的墨叛,也就是只要傳進去的是一個對象止毕,并且該對象有run(),就可以體現(xiàn)出run()的特性漠趁。

小結(jié)

繼承可以把父類的所有功能都直接拿過來扁凛,這樣就不必從零做起,子類只需要新增自己特有的方法闯传,也可以把父類不適合的方法覆蓋重寫谨朝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末字币,一起剝皮案震驚了整個濱河市则披,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洗出,老刑警劉巖士复,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異翩活,居然都是意外死亡阱洪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門菠镇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冗荸,“玉大人,你說我怎么就攤上這事利耍“霰荆” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵隘梨,是天一觀的道長魂毁。 經(jīng)常有香客問我,道長出嘹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任咬崔,我火速辦了婚禮税稼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垮斯。我一直安慰自己郎仆,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布兜蠕。 她就那樣靜靜地躺著扰肌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熊杨。 梳的紋絲不亂的頭發(fā)上蒲肋,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天自点,我揣著相機與錄音,去河邊找鬼。 笑死贷洲,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的督暂。 我是一名探鬼主播胧奔,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鳞绕?” 一聲冷哼從身側(cè)響起失仁,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎们何,沒想到半個月后萄焦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡垂蜗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年楷扬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贴见。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡烘苹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出片部,到底是詐尸還是另有隱情镣衡,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布档悠,位于F島的核電站廊鸥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辖所。R本人自食惡果不足惜惰说,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缘回。 院中可真熱鬧吆视,春花似錦、人聲如沸酥宴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拙寡。三九已至授滓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肆糕,已是汗流浹背般堆。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诚啃,地道東北人郁妈。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像绍申,于是被迫代替她去往敵國和親噩咪。 傳聞我的和親對象是個殘疾皇子顾彰,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354