亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python深入講解魔術(shù)方法

 更新時(shí)間:2022年06月28日 09:55:11   作者:henry_rhy  
所謂魔法函數(shù)(Magic Methods),是Python的?種?級(jí)語(yǔ)法,允許你在類中?定義函數(shù)(函數(shù)名格式?般為_(kāi)_xx__),并綁定到類的特殊?法中。?如在類A中?定義__str__()函數(shù),則在調(diào)?str(A())時(shí),會(huì)?動(dòng)調(diào)?__str__()函數(shù),并返回相應(yīng)的結(jié)果

什么是魔術(shù)方法(魔法方法/特殊方法)

  • 魔術(shù)方法都不需要手動(dòng)去調(diào)用
  • 是在特定的情況下觸發(fā)的
  • 魔術(shù)方法都是在python事先定義好的,在定義方法的時(shí)候,不要使用魔術(shù)方法的命名規(guī)范
  • 魔術(shù)方法是雙劃線開(kāi)頭,雙劃線結(jié)尾的

一、python內(nèi)置的基本魔術(shù)方法

init方法

init 是類在實(shí)例化時(shí)的方法

# 例如
class Mytest():
    def __init__(self):
        print("----這是魔術(shù)方法__init__")
	
Mytest()

call方法

__call__方法的作用 :實(shí)現(xiàn)對(duì)象可調(diào)用

1.沒(méi)有實(shí)現(xiàn) __call__方法時(shí),對(duì)象是不可以被調(diào)用的

# 類
class Demo:
    pass
# 判斷對(duì)象是否可被調(diào)用,有個(gè)函數(shù)可以使用——callable
print(callable(Demo))   ======》 返回True,可被調(diào)用
# demo類創(chuàng)建出來(lái)的對(duì)象是否可被調(diào)用,是不能的被調(diào)用的
obj = Demo()
obj()

執(zhí)行結(jié)果:提示:‘Demo’ object is not callable ----- 沒(méi)有__call__方法

2.如果要類創(chuàng)建對(duì)象出來(lái)的對(duì)象可別調(diào)用,就要用到__call__方法

class Demo:
    def __call__(self, *args,**kwds):
        print("這是__call__方法執(zhí)行了")
print(callable(Demo))
# demo類創(chuàng)建出來(lái)的對(duì)象是否可被調(diào)用(不能被調(diào)用)
obj = Demo()

obj()          # 等同于:obj.__call__() 方法
obj()
obj()

new 方法

__new__方法的作用 : 是創(chuàng)建對(duì)象的方法

__init__方法的作用 : 是用來(lái)初始化對(duì)象的方法

類的對(duì)象要能被調(diào)用:

首要new方法創(chuàng)建對(duì)象,然后通過(guò)init方法初始化

什么時(shí)候會(huì)需要用到New方法:

干預(yù)類實(shí)例化對(duì)象的過(guò)程

注意點(diǎn):

  • 一般情況不要重寫new方法,除非有特定的需求需要使用new方法來(lái)實(shí)現(xiàn)
  • 定義了new方法之后,需要調(diào)用父類的new來(lái)創(chuàng)建對(duì)象 并返回
class MyTest(object):
    # 初始化對(duì)象
    def __init__(self):
        print('-------init------方法')
	# 創(chuàng)建對(duì)象
    def __new__(cls, *args, **kwargs):
        print('------new方法-------')
        obj = super().__new__(cls)        # 調(diào)用父類的new來(lái)創(chuàng)建對(duì)象
        return obj     # 并返回新的對(duì)象
obj = MyTest()

bool(self)方法

定義當(dāng)被 bool() 調(diào)用時(shí)的行為,應(yīng)該返回 True 或 False

class Demo:
    def __bool__(self):
        """內(nèi)置函數(shù)bool(),獲取對(duì)象的布爾值是會(huì)執(zhí)行這個(gè)方法"""
        return True
b = Demo()       
# 獲取對(duì)象的布爾值,返回True 或 False
print(bool(b))    =====》 返回 True

str(self)方法

使用print去輸出對(duì)象時(shí),輸出到控制臺(tái)的內(nèi)容是由__str__來(lái)決定的

class Demo:
    def __str__(self):
        """
        使用print去輸出對(duì)象時(shí),輸出到控制臺(tái)的內(nèi)容是由__str__來(lái)決定的
        """
      return 'zifuc'
b = Demo() 
# str方法
s = str('123')
print(s)    =======》 返回 123

repr(self)方法

這個(gè)方法也是控制對(duì)象顯示的,一般會(huì)顯示對(duì)象的原始信息

class Demo:
    def __repr__(self):
        """
        這個(gè)方法也是控制對(duì)象顯示的,一般會(huì)顯示對(duì)象的原始信息
        """
        return 'repr-number'
b = Demo()         
# repr方法
s = repr('123')
print(s)    =======》 返回 '123'

len(self)方法

獲取對(duì)象的長(zhǎng)度

class Demo:
    def __len__(self):
        """
        這個(gè)方法是獲取對(duì)象的長(zhǎng)度
        :return:
        """
        return 3
 b = Demo()       
# 獲取對(duì)象的長(zhǎng)度
print(len(b))    =====》 返回 3

hash(self)方法

返回對(duì)象的hash值

class Demo:
    def __hash__(self):
        """
        這個(gè)方法是獲取hash值
        :return:
        """
        return 999
b = Demo()   
# 獲取hash值
print(hash(b))    =====》 返回 999

二、python中容器類型的的魔術(shù)方法

setitem(self, key, value)方法

定義設(shè)置容器中指定元素的行為,語(yǔ)法:self[key] = value

class Mytest:
    def __setitem__(self, key, value):
        return setattr(self, key, value)
m = Mytest()
print(m.__dict__)     沒(méi)有數(shù)據(jù),為空字典
m.name = 'gddg'     ==== 》 設(shè)置name屬性,值為gddg
m['age'] = 18      ==== 》 設(shè)置age屬性,值為18

getitem(self, item)方法

定義獲取容器中指定元素的行為,語(yǔ)法: self[key]

class Mytest:
    def __getitem__(self,item):
        return getattr(self,item)
m = Mytest()
print(m['name'])     ==== 》 name屬性,值為gddg

delitem(self, item)方法

定義刪除容器中指定元素的行為,相當(dāng)于 del self[key]

class Mytest:
    def __delitem__(self,item):
        delattr(self,item)
m = Mytest()
del m['name']      ==== 》 刪除name屬性

contains(self, item)方法

定義當(dāng)使用成員測(cè)試運(yùn)算符(in 或 not in)時(shí)的行為, 返回 True 或 False

class MyTest:
    def __contains__(self, item):
        """成員運(yùn)算符觸發(fā)的魔術(shù)方法"""
        return True
a = MyTest()
b = MyTest()
print(a in b)   =======》 返回 True

迭代協(xié)議:__iter__方法

定義當(dāng)?shù)萜髦械脑氐男袨?/p>

class IterClass:
    def __iter__(self):
        """
        __iter__方法的返回值必須是一個(gè)迭代器
        """
        return iter([11, 22, 33, 44])     ===== 》返回一個(gè)迭代器
li = IterClass()
for i in li :
	print(i )
for遍歷對(duì)象:
    1、執(zhí)行對(duì)象的__iter__方法(返回迭代器)
    2、在循環(huán)使用next對(duì)迭代器進(jìn)行迭代

三、python中算數(shù)運(yùn)算符的魔術(shù)方法

add(a,b)方法 和 sub(a,b)方法

a = 1
b = 2
print(a + b)    ======》 實(shí)際執(zhí)行的是:a.__add__(a,b)
print(a - b)    ======》 實(shí)際執(zhí)行的是:a.__sub__(a,b)

字符串類型的是否支持加減的操作

a = '123'
b = '12'
print(a + b)    ======》 實(shí)際執(zhí)行的是:a.__add__(a,b)
print(a - b)    ======》 實(shí)際執(zhí)行的是:a.__sub__(a,b)

對(duì)字符串對(duì)象沒(méi)有實(shí)現(xiàn)__sub__方法,所以不支持對(duì)象直接使用 -

自己在重新定義__sub__方法,實(shí)現(xiàn)對(duì)字符串對(duì)象的減法

class MyStr(str):
    def __sub__(self, other):
        return self.replace(other, '')
a = MyStr('1234')
b = MyStr('123')
print(a + b)     ======= 》  返回 1234123
print(a - b)    ======= 》  返回 4

到此這篇關(guān)于python深入講解魔術(shù)方法的文章就介紹到這了,更多相關(guān)python魔術(shù)方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論