python 类的内置方法_Python 类的常用内置方法
類的內置方法(魔法方法):
凡是在類內部定義,以__開頭__結尾的方法,都是類的內置方法,類的內置方法,會在滿足某種條件下自動觸發。
1.1__new__
__new__:在___init__觸發前,自動觸發。調用該類時,內部會通過__new__產生一個新對象
__init__:在調用類時自動觸發。通過產生的對象自動調用__init__()
class Demo(object):
# 條件: __new__: 在__init__觸發前,自動觸發。
def __new__(cls,*args,**kwargs):
print('此處是__new__方法的執行')
#python內部通過object調用的__new__實現產生一個空的對象 --->內存地址
return object.__new__(cls,*args,**kwargs)
#條件:__init__在調用類時自動觸發
def __init__(self):
print('此處是__init__方法的執行')
Demo()
1.2__getattr__
__getattr__: 在通過 “對象.屬性” 獲取屬性時,若 “屬性沒有” 時觸發。
class Demo(object):
# x =10
def __getattr__(self,item):
print('此處是__getattr__方法的執行')
print(item)
#return 想要返回的值
return 123
obj1 = Demo()
print(obj1.x)
#執行結果:
此處是__getattr__方法的執行
x
123
1.3__getattribute__
條件: __getattribute__: 在通過 “對象.屬性” 獲取屬性時,無論 "屬性有沒有" 都會觸發執行。
class Demo:
#x=10
def __getattr__(self, item):
print('此處是__getattr__方法的執行')
def __getattribute__(self, item):
print('此處是__getattribute__方法的執行')
# 注意: 此處不能通過對象.屬性,否則會產生遞歸調用,程序崩潰
# return self.__dict__[item]
print(item, '<-----打印屬性名字')
# raise AttributeError('拋出異常了')
obj1 = Demo()
obj1.x
# 注意: 只要__getattr__ 與 __getattribute__ 同時存在類的內部,只會觸發__getattribute__。
#若 執行到__getattribute__ 發現raise AttributeError('拋出異常了'),則再觸發__getattr__
1.4__setattr__與__delattr__
條件: __setattr__當 “對象.屬性 = 屬性值” , 添加或修改屬性時觸發執行。
條件:__delattr__當刪除 “對象.屬性” 屬性的時候會觸發執行。
class Demo:
def __setattr__(self, key, value): # key---> 對象.屬性名 value ---》 屬性值
print('此處是__setattr__方法的執行')
print(key, value)
# 出現遞歸
# self.key = value
# 此處是對 對象的名稱空間 ---》 字典進行操作
self.__dict__[key] = value
obj1 = Demo()
obj1.x =10
# 原來設置屬性時,會自動觸發父類中的__setattr__,內部為對象添加x屬性,值為20
print(obj1.__dict__)
#執行結果:
此處是__setattr__方法的執行
x 10
{'x': 10}
class Demo:
x = 1
def __init__(self,y):
self.y = y
def __delattr__(self, item):
print('此處是__delattr__方法的執行')
obj1 = Demo(10)
del obj1.y
del obj1.x
#執行結果:
此處是__delattr__方法的執行
此處是__delattr__方法的執行
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內部肯定有內化機制進行過處理,其實質原理如下
條件: __str__在打印對象時觸發。
注意: 該方法必須要有一個 “字符串” 返回值。
class Demo:
def __str__(self):
print('此處是__str__方法的執行')
return '自定制的對象的顯示方式'
obj1 =Demo()
print(obj1)
#執行結果:
此處是__str__方法的執行
自定制的對象的顯示方式
1.6__getitem__和__setitem__和__delitem__
條件:__getitem__在對象通過 “對象[key]” 獲取屬性時觸發。
class Demo:
def __init__(self,name):
self.name=name
def __getitem__(self, item):
print('此處是__getitem__方法的執行')
print(item)
return self.__dict__[item]
obj1 = Demo('lili')
print(obj1, '<----- 打印的對象')
print(obj1['name'])
條件:__setitem__在對象通過 “對象[key]=value值” 設置屬性時觸發。
class Demo:
def __setitem__(self, key, value):
print('此處是__setitem__方法的執行')
self.__dict__[key] = value
obj1 = Demo()
print(obj1.__dict__)
obj1['name'] = 'baohan'
print(obj1.__dict__)
#執行結果:
{}
此處是__setitem__方法的執行
{'name': 'baohan'}
條件:__delitem__在對象通過 del “對象[key]” 屬性時觸發。
class Demo:
def __setitem__(self, key, value):
print('此處是__setitem__方法的執行')
self.__dict__[key] = value
def __delitem__(self, key):
print('此處是__delitem__方法的執行')
self.__dict__.pop(key)
obj1 = Demo()
print(obj1.__dict__)
obj1['name'] = 'baohan'
print(obj1.__dict__)
#del obj1.name
del obj1['name']
print(obj1.__dict__)
#執行結果:
{}
此處是__setitem__方法的執行
{'name': 'baohan'}
此處是__delitem__方法的執行
{}
1.7__call__
條件: __call__在調用對象 “對象 + ()” 時觸發。
class Demo:
def __call__(self, *args, **kwargs):
print('此處是__call__方法的執行')
# 調用對象時返回的值
return [1,2,3,4]
obj1 =Demo()
obj1()
總結
以上是生活随笔為你收集整理的python 类的内置方法_Python 类的常用内置方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 科技与美学结合,重构家庭生活新空间
- 下一篇: python爬取数据案例分析_基于Pyt