python中魔法方法
python中魔法方法
1、__del__方法
銷燬魔術方法
觸發時機:當一個物件在記憶體中被清理的時候自動執行
引數:至少有一個self,接收物件
返回值:無
作用:在物件清理的時候做一些操作
注意:程式自動呼叫此方法,不需要我們手動呼叫。
class Person(object):
def __init__(self):
print('init')
def __del__(self):
print('銷燬了')
person = Person()
person1 = person
print('程式結束了')
輸出為:
init 程式結束了 銷燬了
如上程式碼所示,當程式執行結束時,沒有再引用的變數時,__del__會生效,所以它不是像我們預想的那樣,呼叫這個物件時__del__就生效,所以 不會輸出
2、__call__方法
call():當給物件加括號時候,自定觸發的函式
進一步模糊了函式和物件之間的概念。
使用方式:物件後面加括號,觸發執行。即:物件() 或者 類()()
class Foo: def __init__(self): pass # 當給物件加括號時候,自定觸發的函式 def __call__(self, *args, **kwargs): print('__call__') obj = Foo() # 執行 __init__,將Foo記憶體地址賦值給了obj obj() # 記憶體地址加括號就是呼叫
輸出為:
__call__
如上程式碼所示,呼叫__call__時,並不需要Foo.call。因為在obj=Foo()時,就已經將Foo()的記憶體地址賦值給了obj,所以後面呼叫時obj本身就代表了那個記憶體地址,當成函式使用obj()
3、__str__方法
觸發時機:列印物件會自定觸發的函式,方法
引數:一個self接收物件
返回值:必須是字串型別
作用:print(物件時)進行操作,得到字串,通常用於快捷操作
class People: school = 'SH' # 1. 列印物件會自定觸發的函式,方法 # 2. 返回值必須是字串型別 def __str__(self): return self.school stu = People() print(stu)
輸出為:
SH
在python中 使用print()函式輸出物件名稱的時候預設情況下,會列印物件名引用的記憶體地址,如果希望列印物件的屬性值,可以使用__str__(self)這個方法。
4、__new__方法
例項化魔術方法
觸發時機: 在例項化對時觸發
引數:至少一個cls接收當前類
返回值:必須返回一個物件例項
作用:例項化物件
注意:例項化物件是Object類底層實現,其他類繼承了Object的__new__才能夠實現例項化物件。
沒事別碰這個魔術方法,先觸發__new__才會觸發__init__
class Person(object):
# 初始化
def __init__(self):
print('init...')
# 例項化方法(構造方法)---》建立物件
def __new__(cls, *args, **kwargs):
print('new...')
ret = super().__new__(cls) # 呼叫父類的__new__()方法建立物件,並用接收返回值
return ret # 將物件返回給person
輸出為:
new...
init...
<__main__.Person object at 0x0000012173217B80>
如上程式碼所示,要先建立一個物件,才能初始化,所以輸出是先輸出new…,才輸出init…
5、getattr、setattr、__delattr__函式
getattr:物件.屬性,當屬性不存在,會自動觸發__getattr__方法
setattr:給不存在屬性賦值的時候執行,會自動觸發__setattr__方法
delattr:當刪除屬性的時候還行,**會自動觸發__delattr__方法
class Foo:
x = 1
def __init__(self, y):
self.y = y
# 當訪問一個不存在的屬性時候,會自定觸發
def __getattr__(self, item):
print('----> from getattr:你找的屬性不存在')
def __setattr__(self, key, value):
print('----> from setattr')
# print(key)
# print(value)
# self.key = value # 這就無限遞迴了,你好好想想
self.__dict__[key] = value # 應該使用它
def __delattr__(self, item):
print('----> from delattr')
# del self.item #無限遞迴了
self.__dict__.pop(item)
obj = Foo(10)
obj.z = 10
print(obj.a) # 不存在的屬性
輸出為:
----> from setattr
----> from setattr
----> from getattr:你找的屬性不存在
None