python 类的内置方法_Python 类的常用内置方法
類的內(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 科技与美学结合,重构家庭生活新空间
- 下一篇: 冰箱里结了厚厚的冰霜以下哪种清除方式更安