day-011--面向對象進階

面向對象進階

1. 訪問權限

1.1 @property

前面講到方法里咕痛,python 可以通過下劃線來標識方法和屬性的權限读第,name 公共,__name私有,_name保護

那么如果想訪問屬性可以通過屬性的getter(訪問器)和setter(修改器)方法進行對應的操作。如果要做到這點,就可以考慮使用@property包裝器來包裝getter和setter方法猜扮,使得對屬性的訪問既安全又方便,代碼如下所示监婶。

class safe:
    __test = 100
    def __init__(self,test):
        self.__test = test

    @property
    def test(self):
        return self.__test

    @test.getter
    def test(self):
        return self.__test

    @test.setter
    def test(self,test):
        self.__test = test

    def show(self):
        print('self.__test:', self.__test)


a = safe(1000)
a.show()
print(a.test)
print(a.test)
a.test = 1111
a.show()
try:
    print(a.__test)
except AttributeError as err1:
    print(err1)

結果:

self.__test: 1000
1000
1000
self.__test: 1111
'safe' object has no attribute '__test'
1.2 __slots__

前面說到屬性是可以動態(tài)刪減的旅赢,如果想保護起來,就得用__slots__ 保護起來
這個關鍵字聲明了只有它限定得屬性是可讀可寫的惑惶,不再元組里的只能讀煮盼,不能寫

看例子:

class test_private:
    'nothong'

    __slots__ = ('_name', '_age', '_high')
    test = 111
    def __init__(self,name,age,high):
        self._name = name
        self._age = age
        self._high = high

    @property
    def name(self):
        return self._name

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, age):
        self._age = age

    def play(self):
        if self._age <= 16:
            print('%s正在玩飛行棋.' % self._name)
        else:
            print('%s正在玩斗地主.' % self._name)


a = test_private('zhangsan', 18, 130)
a.play()
try:
    print('a.name : ', a.name)
except AttributeError as err1:
    print('err1: ',err1)
try:
    a.ability = 'aaa'
except AttributeError as err2:
    print('err2:',err2)

try:
    a.test = 1000
    print(a.test)
except AttributeError as err3:
    print('err3', err3)

a.age = 15
a.play()

結果:

zhangsan正在玩斗地主.
a.name :  zhangsan
err2: 'test_private' object has no attribute 'ability'
err3 'test_private' object attribute 'test' is read-only
zhangsan正在玩飛行棋.

2. 靜態(tài)方法和類方法

之前,我們在類中定義的方法都是對象方法带污,也就是說這些方法都是發(fā)送給對象的消息僵控。靜態(tài)方法是可以發(fā)消息給類的,就是說刮刑,類和對象都可以執(zhí)行喉祭,代碼如下所示养渴。

class test_static:

    @staticmethod
    def test_static(cls):
        print('you can do')

    @staticmethod
    def test_no_param():
        print('you cant')


cls = ''
test_static.test_static(cls=cls)
test_static.test_no_param()
a = test_static()
a.test_static(cls=cls)
a.test_no_param()

結果:

you can do
you cant
you can do
you cant

可以不用加cls

和靜態(tài)方法比較類似,Python還可以在類中定義類方法泛烙,類方法的第一個參數(shù)約定名為cls理卑,它代表的是當前類相關的信息的對象(類本身也是一個對象,有的地方也稱之為類的元數(shù)據(jù)對象)蔽氨,通過這個參數(shù)我們可以獲取和類相關的信息并且可以創(chuàng)建出類的對象藐唠,隨便給自己初始化了,但是要通過靜態(tài)方法鹉究,返回的也是個cls宇立,就是自己,代碼如下所示自赔。

import os
from time import time, localtime, sleep


class Clock(object):
    """數(shù)字時鐘"""

    def __init__(self, hour=0, minute=0, second=0):
        self._hour = hour
        self._minute = minute
        self._second = second

    @classmethod
    def now(cls):
        ctime = localtime(time())
        return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec)

    def run(self):
        """走字"""
        self._second += 1
        if self._second == 60:
            self._second = 0
            self._minute += 1
            if self._minute == 60:
                self._minute = 0
                self._hour += 1
                if self._hour == 24:
                    self._hour = 0

    def show(self):
        """顯示時間"""
        return '%02d:%02d:%02d' % \
               (self._hour, self._minute, self._second)

結果:

18:56:04

就是個1s一次的時間

3. 類之間的關系

這個完全用作者的了妈嘹,主要是要理解
簡單的說,類和類之間的關系有三種:is-a绍妨、has-a和use-a關系润脸。

  • is-a關系也叫繼承或泛化,比如學生和人的關系他去、手機和電子產品的關系都屬于繼承關系毙驯。
  • has-a關系通常稱之為關聯(lián),比如部門和員工的關系灾测,汽車和引擎的關系都屬于關聯(lián)關系爆价;關聯(lián)關系如果是整體和部分的關聯(lián),那么我們稱之為聚合關系媳搪;如果整體進一步負責了部分的生命周期(整體和部分是不可分割的铭段,同時同在也同時消亡),那么這種就是最強的關聯(lián)關系蛾号,我們稱之為合成關系稠项。
  • use-a關系通常稱之為依賴,比如司機有一個駕駛的行為(方法)鲜结,其中(的參數(shù))使用到了汽車展运,那么司機和汽車的關系就是依賴關系。
uml-components.png

uml-example.png

直接上大神的圖

利用類之間的這些關系精刷,我們可以在已有類的基礎上來完成某些操作拗胜,也可以在已有類的基礎上創(chuàng)建新的類,這些都是實現(xiàn)代碼復用的重要手段怒允。復用現(xiàn)有的代碼不僅可以減少開發(fā)的工作量埂软,也有利于代碼的管理和維護,這是我們在日常工作中都會使用到的技術手段。

方便開發(fā)勘畔,幫助你我他

4. 繼承和多態(tài)

繼承和多繼承在上一個文章已經講了

面向對象三大法寶所灸,封裝,繼承炫七,多態(tài)爬立,

  • 封裝:就是類的作用
  • 繼承:就是通過繼承基類已經實現(xiàn)的方法和屬性,來減少開發(fā)量万哪,方便你我他
  • 多態(tài) :就是在繼承的基礎上可以對基類的方法的重寫侠驯,讓子類和父類的方法表現(xiàn)形式不一樣

可能表述有些問題,但是基本方向沒啥問題

文集傳送門 學習python100天


整個學習python100天的目錄傳送門


無敵分割線


再最后面附上大神的鏈接 傳送門

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末奕巍,一起剝皮案震驚了整個濱河市吟策,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌的止,老刑警劉巖檩坚,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冲杀,居然都是意外死亡效床,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門权谁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人憋沿,你說我怎么就攤上這事旺芽。” “怎么了辐啄?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵采章,是天一觀的道長。 經常有香客問我壶辜,道長悯舟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任砸民,我火速辦了婚禮抵怎,結果婚禮上,老公的妹妹穿的比我還像新娘岭参。我一直安慰自己反惕,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布演侯。 她就那樣靜靜地躺著姿染,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秒际。 梳的紋絲不亂的頭發(fā)上悬赏,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天狡汉,我揣著相機與錄音,去河邊找鬼闽颇。 笑死盾戴,一個胖子當著我的面吹牛,可吹牛的內容都是我干的进萄。 我是一名探鬼主播捻脖,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼中鼠!你這毒婦竟也來了可婶?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤援雇,失蹤者是張志新(化名)和其女友劉穎矛渴,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惫搏,經...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡具温,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了筐赔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铣猩。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖茴丰,靈堂內的尸體忽然破棺而出达皿,到底是詐尸還是另有隱情,我是刑警寧澤贿肩,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布峦椰,位于F島的核電站,受9級特大地震影響汰规,放射性物質發(fā)生泄漏汤功。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一溜哮、第九天 我趴在偏房一處隱蔽的房頂上張望滔金。 院中可真熱鬧,春花似錦茬射、人聲如沸鹦蠕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钟病。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肠阱,已是汗流浹背票唆。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屹徘,地道東北人走趋。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像噪伊,于是被迫代替她去往敵國和親簿煌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容