前言:魔法方法(Magic Method)是python內(nèi)置方法,格式為:“__方法名__”,不需要主動調(diào)用,存在的目的是為了給python的解釋器進行調(diào)用,幾乎每個魔法方法都有一個對應(yīng)的內(nèi)置函數(shù),或者運算符,當(dāng)我們對這個對象使用這些函數(shù)或者運算符時就會調(diào)用類中的對應(yīng)魔法方法,可以理解為重寫這些python的內(nèi)置函數(shù)
1、init()魔術(shù)方法
對象初始化時執(zhí)行__init__
class Test:
def __init__(self, name, age):
self.name = name
self.age = age
print("名字:" + self.name)
print("年齡:" + self.age)
if __name__ == '__main__':
a = Test("小李", "18")
-------輸出結(jié)果---------
名字:小李
年齡:18
上面示例會發(fā)現(xiàn):__init__方法會在類實例化的時候自動調(diào)用,無需手動執(zhí)行;
2、new()魔術(shù)方法
對象初始化時執(zhí)行__new__,目的是為該對象分配內(nèi)存空間。
對象初始化時一般先執(zhí)行__new__,再執(zhí)行__init__,看下面示例:
class Test:
def __new__(cls, *args, **kwargs):
print("我是__new__方法")
obj = object.__new__(cls)
print(obj)
return obj
def __init__(self):
print(self)
print("我是__init__方法")
if __name__ == '__main__':
a = Test()
-------輸出結(jié)果---------
我是__new__方法
<__main__.Test object at 0x123902f70>
<__main__.Test object at 0x123902f70>
我是__init__方法
上面示例會發(fā)現(xiàn):
1)__new__魔術(shù)方法返回的就是self的內(nèi)存地址;
2)如果不在__new__方法里面調(diào)object的__new__方法就不會創(chuàng)建對象,__init__不會被執(zhí)行;
3)如果不在__new__方法里面return創(chuàng)建好的對象,__init__不會被執(zhí)行;
3、str()魔術(shù)方法
打印一個對象的時候,默認調(diào)用
class Test:
def __init__(self):
pass
def __str__(self):
return "test_name"
if __name__ == '__main__':
a = Test()
print(a)
-------輸出結(jié)果---------
test_name
上面示例會發(fā)現(xiàn):
1)操作類實例的時候自動化調(diào)用__str__,即print對象時,對象輸出的樣子;
2)還有一個魔術(shù)方法__repr__,與__str__類似,當(dāng)同時出現(xiàn)時,str__優(yōu)先級高于__repr;
4、del()魔術(shù)方法
對象被刪除的時候調(diào)用該方法
class Test:
def __init__(self):
print("初始化對象")
def __del__(self):
print("對象被刪除了")
if __name__ == '__main__':
a = Test()
print("end")
-------輸出結(jié)果---------
初始化對象
對象被刪除了
上面示例會發(fā)現(xiàn):
1)對象在內(nèi)存中被釋放時,自動觸發(fā)執(zhí)行;
2)此方法一般無須定義,因為Python是一門高級語言,程序員在使用時無需關(guān)心內(nèi)存的分配和釋放,因為此工作都是交給Python解釋器來執(zhí)行,所以__del__()的調(diào)用是由解釋器在進行垃圾回收時自動觸發(fā)執(zhí)行的
5、call()魔術(shù)方法
對象當(dāng)作函數(shù)執(zhí)行時會被默認自動調(diào)用
class Test:
def __call__(self, *args, **kwargs):
print("調(diào)用了__call__")
if __name__ == '__main__':
a = Test()
a()
-------輸出結(jié)果---------
調(diào)用了__call__
上面示例會發(fā)現(xiàn):把類實例當(dāng)成函數(shù)執(zhí)行的時候會觸發(fā)__call__方法,對于 call 方法的執(zhí)行是由對象后加括號觸發(fā)的,即:對象() 或者 類()()
6、len()魔術(shù)方法
調(diào)用len()函數(shù)的時候自動調(diào)用
class Test:
def __init__(self, name, age):
self.name = name
self.age = age
def __len__(self):
# 實例有自己的__dict__屬性,__dict__是一個字典,鍵是屬性名,值為屬性值
return len(self.__dict__)
if __name__ == '__main__':
t = Test("狗子", 22)
print(len(t))
-------輸出結(jié)果---------
2
上面示例會發(fā)現(xiàn):調(diào)用len()函數(shù)的時候自動調(diào)用,用來計算對象的長度
7、eq()魔術(shù)方法
調(diào)用相等判斷的時候自動調(diào)用
class Test:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
print(self.age)
print(other.age)
return self.age == other.age
if __name__ == '__main__':
t1 = Test("狗子", 22)
t2 = Test("小李", 23)
print(t1 == t2)
-------輸出結(jié)果---------
22
23
False
8、hash()魔術(shù)方法
調(diào)用hash()方法時自動調(diào)用\
class Test:
def __init__(self, name, age):
self.name = name
self.age = age
def __hash__(self):
return hash(self.name)
if __name__ == '__main__':
t = Test("狗子", 22)
print(hash(t))
-------輸出結(jié)果---------
902838481588431200
注意:只有不可變數(shù)據(jù)類型才有哈希值
9、getitem()魔術(shù)方法
獲取實例屬性的時候自動調(diào)用
class Test:
def __init__(self, name, age):
self.name = name
self.age = age
def __getitem__(self, item):
return self.__dict__[item]
if __name__ == '__main__':
t = Test("狗子", 22)
print(t['name'])
-------輸出結(jié)果---------
狗子
10、setitem()魔術(shù)方法
用于設(shè)置對象屬性
class Test:
def __init__(self, name):
self.name = name
def __setitem__(self, key, value):
self.__dict__[key] = value
if __name__ == '__main__':
t = Test("狗子")
print(t.__dict__)
t['age'] = 22
print(t.__dict__)
-------輸出結(jié)果---------
{'name': '狗子'}
{'name': '狗子', 'age': 22}
11、delitem()魔術(shù)方法
刪除對象屬性時調(diào)用
class Test:
def __init__(self, name):
self.name = name
def __setitem__(self, key, value):
self.__dict__[key] = value
def __delitem__(self, key):
self.__dict__.pop(key)
if __name__ == '__main__':
t = Test("狗子")
print(t.__dict__)
t['age'] = 22
print(t.__dict__)
del t['name']
print(t.__dict__)
-------輸出結(jié)果---------
{'name': '狗子'}
{'name': '狗子', 'age': 22}
{'age': 22}
12、delattr()魔術(shù)方法
class Test:
def __init__(self, name):
self.name = name
def __setitem__(self, key, value):
self.__dict__[key] = value
def __delattr__(self, item):
self.__dict__.pop(item)
if __name__ == '__main__':
t = Test("狗子")
print(t.__dict__)
t['age'] = 22
print(t.__dict__)
del t.name
print(t.__dict__)
-------輸出結(jié)果---------
{'name': '狗子'}
{'name': '狗子', 'age': 22}
{'age': 22}
注意:__delitem__和__delattr__都是刪除對象的屬性,但是其用法不一樣,注意看上面2個示例。文章來源:http://www.zghlxwxcb.cn/news/detail-502101.html
13、add()/sub()魔術(shù)方法
運算符執(zhí)行計算時調(diào)用文章來源地址http://www.zghlxwxcb.cn/news/detail-502101.html
class Test:
def __init__(self, age):
self.age = age
def __add__(self, other):
return self.age + other.age
def __sub__(self, other):
return self.age - other.age
if __name__ == '__main__':
t1 = Test(22)
t2 = Test(23)
print(t1 + t2)
print(t1 - t2)
到了這里,關(guān)于python高級知識之常用的魔術(shù)方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!