成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

經(jīng)驗(yàn)拾憶(純手工)=> Python__黑魔法__

tulayang / 1017人閱讀

摘要:類的繼承類繼承有三種調(diào)用方式,其實(shí)是有區(qū)別的,聽我慢慢道來第一種父類方法參數(shù)直接調(diào)用第二種方法參數(shù)直接調(diào)用在誰的類下調(diào)用,就找此類對(duì)應(yīng)的下一個(gè)就是要繼承的第三種方法參數(shù)找類名對(duì)應(yīng)的的下一個(gè),就是繼承的,一般寫本身的類名上下文管理器上下文管理

類的繼承
類繼承有三種調(diào)用方式,其實(shí)是 有區(qū)別 的,聽我慢慢道來
class A:
    def say(self, name):
        print(f"Im {name}")
class B(A):
    def say(self, name):
    # 第一種:父類.方法(self, 參數(shù)) 直接調(diào)用
        A.say(self, name)    
        
    def say(self, name):
    # 第二種:super().方法(參數(shù))    直接調(diào)用
    # 在誰的類下調(diào)用super,就找此類對(duì)應(yīng) mro()的下一個(gè),就是要繼承的
         super().say(name)
         
    def say(self, name):
    # 第三種:super(B, self).方法(參數(shù))
    # 找類名 對(duì)應(yīng)的 mro()的下一個(gè),就是 繼承的,一般寫本身的類名
        super(B, self).say(name)

B().say("Tom")
上下文管理器
"""
    上下文管理器可以用兩種方式實(shí)現(xiàn):
"""
     方式1:通過類來實(shí)現(xiàn)
        主要實(shí)現(xiàn)兩種協(xié)議
            1. __enter__(self)
            2. __exit__(self, *args, **kwargs)
                
        class A():
            def __init__(self, name):
                self.name = name
            def __enter__(self):
                print("進(jìn)入")
                return self
            def __exit__(self, *args, **kwargs):
                print("退出")
                return True
        
        with A("Tom") as a:
            print(a.name)

    方式2:通過函數(shù)來實(shí)現(xiàn)
        from contextlib import contextmanager
        @contextmanager
        def f():
            print("開始")    # yield 之前 對(duì)應(yīng) with f()
            yield "中間"     # yield 的值 就是    as 之后的值
            print("結(jié)束")    # yield 之后 對(duì)應(yīng) print(str1) 這個(gè)語句體
        
        with f() as str1:
            print(str1)
        ------------------Output----------------------
        開始
        中間
        結(jié)束
屬性描述符-property-setter
class A:
@property
def name(self):
    return "123"
@name.setter
def name(self, value):
    self.age=value

a = A()
print(a.name)
a.name = "456"
print(a.age)


__init__()
實(shí)例化對(duì)象時(shí)自動(dòng)調(diào)用,這里先賣個(gè)關(guān)子,見下面 __new__()
__call__()
"""
   對(duì)象當(dāng)做函數(shù)執(zhí)行的時(shí)候會(huì)自動(dòng)調(diào)用 __call__()
"""
class A():
    pass
a = A()    # 此處自動(dòng)調(diào)用了 __init__()
a()        # 此處自動(dòng)調(diào)用了 __call__()
__str__()
"""
    對(duì)對(duì)象進(jìn)行print操作的時(shí)候 會(huì)自動(dòng)調(diào)用 __str__()
"""
class A:
    def __str__(self):
        return "5"
a = A()
print(a)  # 此處自動(dòng)調(diào)用了 __str__()
__new__()
"""
    上面說過 __init__()是實(shí)例化對(duì)象的時(shí)候自動(dòng)調(diào)用,在它之前還隱式調(diào)用了 __new__()
    __new__返回的是什么,對(duì)象就是什么
"""
In [2]: class A:
   ...:   def __new__(self):
   ...:     print("__new__")    # 初始化對(duì)象只調(diào)用 __new__ 而不調(diào)用 __init__
   ...:     return 1
   ...:   def __init__(self):
   ...:     print(2)
   ...: print(A())
    __new__
    1
__setattr__() 和 __getattr__() 和 __delattr__()
"""
    __setattr__():=號(hào) 屬性賦值 會(huì)自動(dòng)調(diào)用此方法 
    __getattr__():.號(hào) 屬性取值 會(huì)自動(dòng)調(diào)用此方法    # 注:找不到屬性才會(huì)調(diào)用此方法
    __delattr__():del 屬性刪除 會(huì)自動(dòng)調(diào)用此方法
"""
class A:

    def __init__(self, name):
        self.name = name        # 賦值操作就會(huì)調(diào)用 __setattr__()
    
    def __setattr__(self, name, value):
        print(f"{name}:{value}")
    def __getattr__(self, name):
        print(name)
    def __delattr__(self,name):
        print("del了")
        
a = A("Jack")    # 調(diào)用了 __init__
a.name = "Tom"   # 賦值操作再次調(diào)用 __setattr__()
a.name           # 取值操作調(diào)用 __getattr__()
---------------------output---------------------
name:Jack
name:Tom
name
del了
__getattribute__()
"""
    和 __getattr__() 一樣,只不過 __getattribute__最先調(diào)用,并攔截了 __getattr__()
"""
class A:
    def __init__(self):
        self.name = 1
    def __getattr__(self,x,*args, **kwargs):
        print(456)
    def __getattribute__(self, x):
        print(123)

a = A()
a.aaaaaa
-----------output---------------
123
__getitem__()
"""
    對(duì)對(duì)象進(jìn)行 切片、索引、遍歷 等 會(huì)自動(dòng)調(diào)用此方法
"""
class A:
def __getitem__(self,x,*args, **kwargs):
    return x

a = A()
觸發(fā)方式1: 如果直接索引此對(duì)象,那么索引值就會(huì)傳遞到上面 x 當(dāng)作參數(shù)
    print(a[5])
    >> 5
觸發(fā)方式2: 如果直接切片此對(duì)象,那么slice對(duì)象 就會(huì)傳遞到上面 x 當(dāng)作參數(shù)
    print(a[1:5])
    >> slice(1, 5, None)
觸發(fā)方式3: 如果for循環(huán)迭代此對(duì)象,那么 上面的 x 每次將會(huì)被賦予從零開始 自增1的自然整數(shù)
    for x in a:
        print(x)
    >> 0,1,2,3,4.................... 
__init_subclass__()
"""
    被繼承的類 會(huì)自動(dòng)調(diào)用__init_subclass__ 
"""
class A:
    def __init_subclass__(self):
        print("我被繼承了")

class B(A):
    pass
__base__()
"""
    查看基類
"""
class A:
    pass
class B(A):
    pass
print(B.__base__)
-----------output---------------
__contains__()
"""
    xx in xx 就會(huì)自動(dòng)調(diào)用  __contains__()
"""

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43860.html

相關(guān)文章

  • 經(jīng)驗(yàn)拾憶手工)=> Python三器

    摘要:也就是給原函數(shù)加個(gè)外殼。類裝飾填充了啊我是原函數(shù)類裝飾填充了啊我是原函數(shù)說明后面關(guān)于類的裝飾器如果理解困難當(dāng)做了解即可,用的也少。 可迭代對(duì)象、生成器、迭代器三者的關(guān)系 1. 迭代器一定是可迭代對(duì)象 2. 生成器是迭代器的一種 3. 可迭代對(duì)象:必須實(shí)現(xiàn) __iter__方法 4. 迭代器:必須實(shí)現(xiàn) __iter__方法 和 __next__ 方法 5. 生成器:必須實(shí)現(xiàn) __it...

    Miracle_lihb 評(píng)論0 收藏0
  • 經(jīng)驗(yàn)拾憶手工)=> Python三程

    摘要:多線程對(duì)于爬蟲方面也可以表現(xiàn)出較好的性能。計(jì)算密集型就別想多線程了,一律多進(jìn)程。所以同一時(shí)刻最大的并行線程數(shù)進(jìn)程數(shù)的核數(shù)這條我的個(gè)人理解很模糊,參考吧多線程多線程有種通過的那種方式,非常普遍,此處就不寫了。 GIL的理解 GIL這個(gè)話題至今也是個(gè)爭(zhēng)議較多的,對(duì)于不用應(yīng)用場(chǎng)景對(duì)線程的需求也就不同,說下我聽過的優(yōu)點(diǎn): 1. 我沒有用過其他語言的多線程,所以無法比較什么,但是對(duì)于I/O而言,...

    Snailclimb 評(píng)論0 收藏0
  • 經(jīng)驗(yàn)拾憶手工)=> Python好用深度技能工具介紹

    摘要:?jiǎn)卧卦孢@是整數(shù)這才是元祖也許這兩行,你們當(dāng)時(shí)疑惑過,并且現(xiàn)在也都知道了,當(dāng)然重點(diǎn)并不在這里。。雖然我水平很垃圾,但是我知道匿名函數(shù)有一種執(zhí)行方式叫做自執(zhí)行??窗?,這就是版的匿名函數(shù)自執(zhí)行方法。 單元素元祖: a = (1) # 這是整數(shù)1 a = (1,) # 這才是元祖 也許這兩行,你們當(dāng)時(shí)疑惑過,并且現(xiàn)在也都知道了,當(dāng)然重點(diǎn)并不在這里。。 我無聊的時(shí)候想過,為什么單...

    UnixAgain 評(píng)論0 收藏0
  • 經(jīng)驗(yàn)拾憶手工)=> Python高階函數(shù)操作

    摘要:解釋就相當(dāng)于把每個(gè)序列元素的每一個(gè)單獨(dú)用一個(gè)管道函數(shù)處理,再把他們按順序組合成一個(gè)新可迭代對(duì)象注意這個(gè)管道函數(shù)只能是單參數(shù)函數(shù),如果想傳遞多個(gè)參數(shù)怎么辦使用偏函數(shù)怕有些人看不懂,這里就不用了,而是用普通函數(shù)定義方式固定值固定值固定值固定值固 map In [25]: list(map(lambda a:a**2, [1,2,3,4])) Out[25]: [1, 4, 9, 16] 解...

    Elle 評(píng)論0 收藏0
  • 經(jīng)驗(yàn)拾憶手工)=> Python基本數(shù)據(jù)類型

    摘要:不要疑惑,告訴你答案這個(gè)代表正負(fù)號(hào)的正。雖然一點(diǎn)技術(shù)含量沒有,但是你要懂序列也許叫可迭代對(duì)象更為合適,但是我喜歡叫序列。 數(shù)據(jù)結(jié)構(gòu) 可變類型與不可變類型(重頭戲) 基操: 可變類型:[], {} # 可增刪改 查 不可變類型: int float str () # 無法增刪改, 只可查 升操: + 與...

    Andrman 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<