凡是在類內部定義,以__開頭__結尾的方法,都是類的內建方法,類的內建方法,會在滿足某種條件下自動觸發。
__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()
__getattr__: 在通過 「物件.屬性」 獲取屬性時,若 「屬性沒有」 時觸發。
class demo(object):
# x =10
def __getattr__(self,item):
print('此處是__getattr__方法的執行')
print(item)
#return 想要返回的值
return 123
obj1 = demo()
print(obj1.x)
#執行結果:
此處是__getattr__方法的執行
x123
條件: __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__
條件: __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
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__方法的執行
引子:想一想下列情況為什麼不一樣?
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__方法的執行
自定製的物件的顯示方式
條件:__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__方法的執行
條件:__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__方法的執行
此處是__delitem__方法的執行
{}
條件: __call__在呼叫物件 「物件 + ()」 時觸發。
class demo:
def __call__(self, *args, **kwargs):
print('此處是__call__方法的執行')
# 呼叫物件時返回的值
return [1,2,3,4]
obj1 =demo()
obj1()
python 類的內建方法
1.doc 列印類的備註 class animal object 建立動物類 def run self 動物都會跑 pass a animal 列印animal類的備註 print a.doc 2.call 將類進行例項化後,呼叫該例項時,會執行 call 方法。注意 類中無 call 方法時,例項...
Python 類的內建方法
usr bin env python coding utf 8 python內建方法 class a n a deff2 self print from a class b a n b deff1 self print from b def f2 self print f2 from b class...
python常用內建方法
字串 分割 hello world split hello world 索引 hello world 8 5 1 row 迭代 for i in hello print i,end h e l l o 計數 hello world count l 3 連線可迭代物件 join 1 2 3 4 1 2...