python 类的内置方法_Python 类的常用内置方法
類的內(nèi)置方法(魔法方法):
凡是在類內(nèi)部定義,以__開(kāi)頭__結(jié)尾的方法,都是類的內(nèi)置方法,類的內(nèi)置方法,會(huì)在滿足某種條件下自動(dòng)觸發(fā)。
1.1__new__
__new__:在___init__觸發(fā)前,自動(dòng)觸發(fā)。調(diào)用該類時(shí),內(nèi)部會(huì)通過(guò)__new__產(chǎn)生一個(gè)新對(duì)象
__init__:在調(diào)用類時(shí)自動(dòng)觸發(fā)。通過(guò)產(chǎn)生的對(duì)象自動(dòng)調(diào)用__init__()
class Demo(object):
# 條件: __new__: 在__init__觸發(fā)前,自動(dòng)觸發(fā)。
def __new__(cls,*args,**kwargs):
print('此處是__new__方法的執(zhí)行')
#python內(nèi)部通過(guò)object調(diào)用的__new__實(shí)現(xiàn)產(chǎn)生一個(gè)空的對(duì)象 --->內(nèi)存地址
return object.__new__(cls,*args,**kwargs)
#條件:__init__在調(diào)用類時(shí)自動(dòng)觸發(fā)
def __init__(self):
print('此處是__init__方法的執(zhí)行')
Demo()
1.2__getattr__
__getattr__: 在通過(guò) “對(duì)象.屬性” 獲取屬性時(shí),若 “屬性沒(méi)有” 時(shí)觸發(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__: 在通過(guò) “對(duì)象.屬性” 獲取屬性時(shí),無(wú)論 "屬性有沒(méi)有" 都會(huì)觸發(fā)執(zhí)行。
class Demo:
#x=10
def __getattr__(self, item):
print('此處是__getattr__方法的執(zhí)行')
def __getattribute__(self, item):
print('此處是__getattribute__方法的執(zhí)行')
# 注意: 此處不能通過(guò)對(duì)象.屬性,否則會(huì)產(chǎn)生遞歸調(diào)用,程序崩潰
# return self.__dict__[item]
print(item, '<-----打印屬性名字')
# raise AttributeError('拋出異常了')
obj1 = Demo()
obj1.x
# 注意: 只要__getattr__ 與 __getattribute__ 同時(shí)存在類的內(nèi)部,只會(huì)觸發(fā)__getattribute__。
#若 執(zhí)行到__getattribute__ 發(fā)現(xiàn)raise AttributeError('拋出異常了'),則再觸發(fā)__getattr__
1.4__setattr__與__delattr__
條件: __setattr__當(dāng) “對(duì)象.屬性 = 屬性值” , 添加或修改屬性時(shí)觸發(fā)執(zhí)行。
條件:__delattr__當(dāng)刪除 “對(duì)象.屬性” 屬性的時(shí)候會(huì)觸發(fā)執(zhí)行。
class Demo:
def __setattr__(self, key, value): # key---> 對(duì)象.屬性名 value ---》 屬性值
print('此處是__setattr__方法的執(zhí)行')
print(key, value)
# 出現(xiàn)遞歸
# self.key = value
# 此處是對(duì) 對(duì)象的名稱空間 ---》 字典進(jìn)行操作
self.__dict__[key] = value
obj1 = Demo()
obj1.x =10
# 原來(lái)設(shè)置屬性時(shí),會(huì)自動(dòng)觸發(fā)父類中的__setattr__,內(nèi)部為對(duì)象添加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類的實(shí)例化出來(lái)的一個(gè)實(shí)例,即一個(gè)對(duì)象
print(l) #['h','e','l','l','o']
class Foo:
pass
f1 = Foo()
print(f1) #<__main__.Foo object at 0x0000022735920688>
以上所知,所以python內(nèi)部肯定有內(nèi)化機(jī)制進(jìn)行過(guò)處理,其實(shí)質(zhì)原理如下
條件: __str__在打印對(duì)象時(shí)觸發(fā)。
注意: 該方法必須要有一個(gè) “字符串” 返回值。
class Demo:
def __str__(self):
print('此處是__str__方法的執(zhí)行')
return '自定制的對(duì)象的顯示方式'
obj1 =Demo()
print(obj1)
#執(zhí)行結(jié)果:
此處是__str__方法的執(zhí)行
自定制的對(duì)象的顯示方式
1.6__getitem__和__setitem__和__delitem__
條件:__getitem__在對(duì)象通過(guò) “對(duì)象[key]” 獲取屬性時(shí)觸發(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, '<----- 打印的對(duì)象')
print(obj1['name'])
條件:__setitem__在對(duì)象通過(guò) “對(duì)象[key]=value值” 設(shè)置屬性時(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__在對(duì)象通過(guò) del “對(duì)象[key]” 屬性時(shí)觸發(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)用對(duì)象 “對(duì)象 + ()” 時(shí)觸發(fā)。
class Demo:
def __call__(self, *args, **kwargs):
print('此處是__call__方法的執(zhí)行')
# 調(diào)用對(duì)象時(shí)返回的值
return [1,2,3,4]
obj1 =Demo()
obj1()
總結(jié)
以上是生活随笔為你收集整理的python 类的内置方法_Python 类的常用内置方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 科技与美学结合,重构家庭生活新空间
- 下一篇: 冰箱里结了厚厚的冰霜以下哪种清除方式更安