日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

python 类的内置方法_Python 类的常用内置方法

發(fā)布時間:2024/9/18 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 类的内置方法_Python 类的常用内置方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

類的內(nèi)置方法(魔法方法):

凡是在類內(nèi)部定義,以__開頭__結(jié)尾的方法,都是類的內(nèi)置方法,類的內(nèi)置方法,會在滿足某種條件下自動觸發(fā)。

1.1__new__

__new__:在___init__觸發(fā)前,自動觸發(fā)。調(diào)用該類時,內(nèi)部會通過__new__產(chǎn)生一個新對象

__init__:在調(diào)用類時自動觸發(fā)。通過產(chǎn)生的對象自動調(diào)用__init__()

class Demo(object):

# 條件: __new__: 在__init__觸發(fā)前,自動觸發(fā)。

def __new__(cls,*args,**kwargs):

print('此處是__new__方法的執(zhí)行')

#python內(nèi)部通過object調(diào)用的__new__實現(xiàn)產(chǎn)生一個空的對象 --->內(nèi)存地址

return object.__new__(cls,*args,**kwargs)

#條件:__init__在調(diào)用類時自動觸發(fā)

def __init__(self):

print('此處是__init__方法的執(zhí)行')

Demo()

1.2__getattr__

__getattr__: 在通過 “對象.屬性” 獲取屬性時,若 “屬性沒有” 時觸發(fā)。

class Demo(object):

# x =10

def __getattr__(self,item):

print('此處是__getattr__方法的執(zhí)行')

print(item)

#return 想要返回的值

return 123

obj1 = Demo()

print(obj1.x)

#執(zhí)行結(jié)果:

此處是__getattr__方法的執(zhí)行

x

123

1.3__getattribute__

條件: __getattribute__: 在通過 “對象.屬性” 獲取屬性時,無論 "屬性有沒有" 都會觸發(fā)執(zhí)行。

class Demo:

#x=10

def __getattr__(self, item):

print('此處是__getattr__方法的執(zhí)行')

def __getattribute__(self, item):

print('此處是__getattribute__方法的執(zhí)行')

# 注意: 此處不能通過對象.屬性,否則會產(chǎn)生遞歸調(diào)用,程序崩潰

# return self.__dict__[item]

print(item, '<-----打印屬性名字')

# raise AttributeError('拋出異常了')

obj1 = Demo()

obj1.x

# 注意: 只要__getattr__ 與 __getattribute__ 同時存在類的內(nèi)部,只會觸發(fā)__getattribute__。

#若 執(zhí)行到__getattribute__ 發(fā)現(xiàn)raise AttributeError('拋出異常了'),則再觸發(fā)__getattr__

1.4__setattr__與__delattr__

條件: __setattr__當 “對象.屬性 = 屬性值” , 添加或修改屬性時觸發(fā)執(zhí)行。

條件:__delattr__當刪除 “對象.屬性” 屬性的時候會觸發(fā)執(zhí)行。

class Demo:

def __setattr__(self, key, value): # key---> 對象.屬性名 value ---》 屬性值

print('此處是__setattr__方法的執(zhí)行')

print(key, value)

# 出現(xiàn)遞歸

# self.key = value

# 此處是對 對象的名稱空間 ---》 字典進行操作

self.__dict__[key] = value

obj1 = Demo()

obj1.x =10

# 原來設(shè)置屬性時,會自動觸發(fā)父類中的__setattr__,內(nèi)部為對象添加x屬性,值為20

print(obj1.__dict__)

#執(zhí)行結(jié)果:

此處是__setattr__方法的執(zhí)行

x 10

{'x': 10}

class Demo:

x = 1

def __init__(self,y):

self.y = y

def __delattr__(self, item):

print('此處是__delattr__方法的執(zhí)行')

obj1 = Demo(10)

del obj1.y

del obj1.x

#執(zhí)行結(jié)果:

此處是__delattr__方法的執(zhí)行

此處是__delattr__方法的執(zhí)行

1.5__str__

引子:想一想下列情況為什么不一樣?

l =list('hello') #l是list類的實例化出來的一個實例,即一個對象

print(l) #['h','e','l','l','o']

class Foo:

pass

f1 = Foo()

print(f1) #<__main__.Foo object at 0x0000022735920688>

以上所知,所以python內(nèi)部肯定有內(nèi)化機制進行過處理,其實質(zhì)原理如下

條件: __str__在打印對象時觸發(fā)。

注意: 該方法必須要有一個 “字符串” 返回值。

class Demo:

def __str__(self):

print('此處是__str__方法的執(zhí)行')

return '自定制的對象的顯示方式'

obj1 =Demo()

print(obj1)

#執(zhí)行結(jié)果:

此處是__str__方法的執(zhí)行

自定制的對象的顯示方式

1.6__getitem__和__setitem__和__delitem__

條件:__getitem__在對象通過 “對象[key]” 獲取屬性時觸發(fā)。

class Demo:

def __init__(self,name):

self.name=name

def __getitem__(self, item):

print('此處是__getitem__方法的執(zhí)行')

print(item)

return self.__dict__[item]

obj1 = Demo('lili')

print(obj1, '<----- 打印的對象')

print(obj1['name'])

條件:__setitem__在對象通過 “對象[key]=value值” 設(shè)置屬性時觸發(fā)。

class Demo:

def __setitem__(self, key, value):

print('此處是__setitem__方法的執(zhí)行')

self.__dict__[key] = value

obj1 = Demo()

print(obj1.__dict__)

obj1['name'] = 'baohan'

print(obj1.__dict__)

#執(zhí)行結(jié)果:

{}

此處是__setitem__方法的執(zhí)行

{'name': 'baohan'}

條件:__delitem__在對象通過 del “對象[key]” 屬性時觸發(fā)。

class Demo:

def __setitem__(self, key, value):

print('此處是__setitem__方法的執(zhí)行')

self.__dict__[key] = value

def __delitem__(self, key):

print('此處是__delitem__方法的執(zhí)行')

self.__dict__.pop(key)

obj1 = Demo()

print(obj1.__dict__)

obj1['name'] = 'baohan'

print(obj1.__dict__)

#del obj1.name

del obj1['name']

print(obj1.__dict__)

#執(zhí)行結(jié)果:

{}

此處是__setitem__方法的執(zhí)行

{'name': 'baohan'}

此處是__delitem__方法的執(zhí)行

{}

1.7__call__

條件: __call__在調(diào)用對象 “對象 + ()” 時觸發(fā)。

class Demo:

def __call__(self, *args, **kwargs):

print('此處是__call__方法的執(zhí)行')

# 調(diào)用對象時返回的值

return [1,2,3,4]

obj1 =Demo()

obj1()

總結(jié)

以上是生活随笔為你收集整理的python 类的内置方法_Python 类的常用内置方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。