深入理解類和對象

1.1 抽象基類(abc模塊)

python的抽象類的寫法,繼承抽象類的類必須要實(shí)現(xiàn)抽象方法,否則會(huì)報(bào)錯(cuò)

import abc

class CacheBase(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def get(self, key):
        pass

    @abc.abstractmethod
    def set(self, key, value):
        pass

class RedisCache(CacheBase):
    def set(self, key, value):
        print("setMethod")
    def get(self, key):
        print("getMethod")

redis_cache = RedisCache()
redis_cache.get('kv')

class A:
    pass

class B(A):
    pass

b = B()

print(isinstance(b, B))   # True
print(isinstance(b, A))   # True
print(type(A) is B)         # False

1.2 類方法,靜態(tài)方法,實(shí)例方法

類方法相對靜態(tài)方法有一個(gè)好處, 類方法可以傳入一個(gè)類的實(shí)例代表這個(gè)類,而不用把類名寫死

class Date():
    # 構(gòu)造函數(shù)
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    #實(shí)例方法
        def tomorrow(self):
            self.day += 1

    @staticmethod
    def parse_from_string(date_str):
        year, month, day = tuple(date_str.split("-"))
        return Date(int(year), int(month), int(day))

    @classmethod
    def from_string(cls, date_str):
        year, month, day = tuple(date_str.split("-"))
        return cls(int(year), int(month), int(day))

    def __str__(self):
        return "{year}/{month}/{day}".format(year=self.year, month=self.month, day=self.day)

if __name__ == "__main__":

    date_str="2018-01-19"
    d = Date.from_string(date_str)
    print(d)                                              # 2018/1/19

1.3 類和實(shí)例方法查找順序

Python在多繼承時(shí)候查找順序采用c3算法

菱形結(jié)構(gòu)
class D:
    pass

class C(D):
    pass

class B(D):
    pass

class A(B,C):
    pass

#順序:A,B,C,D
#__mro__,類的屬性查找順序
print(A.__mro__)              # (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>,<class '__main__.D'>, <class 'object'>)
廣型結(jié)構(gòu)
class D:
    pass

class E:
    pass

class C(E):
    pass

class B(D):
    pass

class A(B,C):
    pass

print(A.__mro__)      # (<class '__main__.A'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.C'>, <class '__main__.E'>, <class 'object'>)

1.4 Python對象的自省機(jī)制

在計(jì)算機(jī)編程中小压,自省是指一種能力:檢查某些事物以確定它是什么贪嫂、它知道什么以及它能做什么。自省向程序員提供了極大的靈活性和控制力

class Person:
    """這是個(gè)人"""
    name = "lala"

class Student(Person):
    def __init__(self, scool_name):
        self.scool_name = scool_name
        self.lal = "緯度"

if __name__ == "__main__":
    user = Student("慕課網(wǎng)")

    # 通過__dict__查詢屬性
    user.__dict__["school_aadd"] = "沈陽"

    print(user.__dict__)                     # {'scool_name': '慕課網(wǎng)', 'lal': '緯度', 'school_aadd': '沈陽'}

    print(Person.__dict__)                   

    # {'__module__': '__main__', '__doc__': '這是個(gè)人', 'name': 'lala', '__dict__': <attribute '__dict__' of 'Person' objects>, 
    '__weakref__': <attribute '__weakref__' of 'Person' objects>}

    print(Person.__doc__)     # 這是個(gè)人

    # dir也可以查看屬性综芥,比__dict__功能更強(qiáng)大
    print(dir(user))

    # ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__',  '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__',  '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'lal', 'name', 'school_aadd', 'scool_name']

1.5 super函數(shù)執(zhí)行順序

一問super是干什么的, 都知道它調(diào)用父類的方法, 可它的調(diào)用順序呢

# super執(zhí)行順序是怎樣的
class A:
    def __init__(self):
        print("A")

class B(A):
    def __init__(self):
        print("B")
        super().__init__()

class C(A):
    def __init__(self):
        print("C")
        super().__init__()

class D(B, C):
    def __init__(self):
        print("D")
        super().__init__()

if __name__ == "__main__":
    d = D()

1.6 with方法(上下文管理器)

with有點(diǎn)像裝飾器,使用起來很方便

class Sample:
    def __enter__(self):
        print("enter")
        # 獲取資源
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        # 釋放資源
        print("exit")

    def do_something(self):
        print("lala")

with Sample() as sample:
    sample.do_something()
# enter lala exit
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市反砌,隨后出現(xiàn)的幾起案子雾鬼,更是在濱河造成了極大的恐慌,老刑警劉巖宴树,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件策菜,死亡現(xiàn)場離奇詭異,居然都是意外死亡酒贬,警方通過查閱死者的電腦和手機(jī)又憨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锭吨,“玉大人蠢莺,你說我怎么就攤上這事×闳纾” “怎么了躏将?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長考蕾。 經(jīng)常有香客問我耸携,道長,這世上最難降的妖魔是什么辕翰? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任夺衍,我火速辦了婚禮,結(jié)果婚禮上喜命,老公的妹妹穿的比我還像新娘沟沙。我一直安慰自己,他們只是感情好壁榕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布矛紫。 她就那樣靜靜地躺著,像睡著了一般牌里。 火紅的嫁衣襯著肌膚如雪颊咬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天牡辽,我揣著相機(jī)與錄音喳篇,去河邊找鬼。 笑死态辛,一個(gè)胖子當(dāng)著我的面吹牛麸澜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奏黑,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼炊邦,長吁一口氣:“原來是場噩夢啊……” “哼焊切!你這毒婦竟也來了熬甫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤涕刚,失蹤者是張志新(化名)和其女友劉穎乏梁,沒想到半個(gè)月后笔宿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體律姨,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡官地,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炉媒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踪区。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昆烁,死狀恐怖吊骤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情静尼,我是刑警寧澤白粉,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站鼠渺,受9級(jí)特大地震影響鸭巴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拦盹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一鹃祖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧普舆,春花似錦恬口、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛾洛,卻和暖如春养铸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轧膘。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工钞螟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谎碍。 一個(gè)月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓筛圆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親椿浓。 傳聞我的和親對象是個(gè)殘疾皇子太援,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理闽晦,服務(wù)發(fā)現(xiàn),斷路器提岔,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 秋天站在窗前 文/目成 仰望秋日的長空 抑或應(yīng)付于日子的空隙 塵世中 誰不是被塵埃擁抱 誰不是在香氣中痛哭 唯有故...
    目成1987閱讀 388評論 0 9
  • 敏丫丫閱讀 146評論 0 0