Python 類的常用內建方法

2022-05-06 21:30:08 字數 4370 閱讀 2381

凡是在類內部定義,以__開頭__結尾的方法,都是類的內建方法,類的內建方法,會在滿足某種條件下自動觸發。

__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...