Python面向對象之魔法方法/雙下方法
1.__new__ and __init__
這兩個方法都是在實例化的時候執行,__new__ 在 __init__ 之前執行,並且
如果實例化的時候封裝屬性,__new__也是必須要傳的,而且__new__必須有返回
值,而且這個返回值就是對象的內存空間而且會傳給__init__的self參數,而且
封裝的屬性也會傳給__init__.
class A:
def __new__(cls, *args, **kwargs):
print("我執行了")
return super().__new__(cls)
def __init__(self, name):
self.name = name
print("我也執行了")
a = A("Tom")
結果:
我執行了
我也執行了
單例模式:
class A:
__INS = None
def __new__(cls, *args, **kwargs):
if not cls.__INS:
cls.__INS = super().__new__(cls)
return cls.__INS
a0 = A()
a1 = A()
a2 = A()
print(a0)
print(a1)
print(a2)
結果:
2. __hash__ 當調用hash函數,字典的快速查詢 創建字典,集合的時候自動調用,為什麼字典和集合的創建會調用?
那是因為字典和集合的創建是根據hash函數直接生成哈希值存儲的,查詢的時候是特別快的。必須有返回值,且為整數。
class A:
def __hash__(self):
print("我執行了")
return 1
a0 = A()
hash(a0)
dic =
s =
結果:
我執行了
我執行了
我執行了
3.item系列 和 obj使用[]訪問值有關係
__getitem__ obj[key] / obj[start:end] 自動執行
__setitem__ obj[key] = value 賦值的時候自動執行
__delitem__ del obj[key] del 的時候執行
class A:
def __getitem__(self, item):
return getattr(self, item)
def __setitem__(self, key, value):
return setattr(self, key, value)
def __delitem__(self, key):
return delattr(self, key)
a = A()
a["k"] = "v" # __setitem__
print(a["k"]) # __getitem__
print(a.__dict__)
del a["k"] # __delitem__
print(a.__dict__)
4.__call__ obj() 和 類()() 自動執行
class A:
def __call__(self, *args, **kwargs):
print("我執行了")
a = A()
A()()
a()
結果:
我執行了
我執行了
5.__len__ 該方法是對象在調用 len() 這個內置函數的時候自動觸發。必須有返回值,且為整數類型
class A:
def __len__(self):
print("我執行了")
return 1
a = A()
len(a)
結果:
我執行了
6. __eq__ 當執行 == 這個魔法糖時自動執行 __eq__ 方法 ,必須有返回值,且為bool
class A:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
return True if self.name == other.name and self.age == other.age else False
a0 = A("W", 18)
a1 = A("W", 18)
a2 = A("W", 18)
a3 = A("W", 18)
a4 = A("W", 18)
a5 = A("W", 18)
a6 = A("W", 18)
print(a0, a1)
print(a0 == a1)
print(a3 == a0 == a4) # ==這個語法 是完全和__eq__
結果:
True
True
7. __str__ and __repr__
# __str__ : str(obj),要求必須實現了__str__,要求這個方法的返回值必須是字元串str類型
# print(obj) "%s"%s(obj) str(obj) 這三種情況會自動觸發
# __repr__: 是__str__的備胎.如果有__str__方法,那麼
# print %s str都先去執行__str__方法,並且使用__str__的返回值
# 如果沒有__str__,那麼 print %s str都會執行repr
# repr(obj),%r
# 在子類中使用__str__,先找子類的__str__,沒有的話要向上找,只要父類不是object,就執行父類的__str__
# 但是如果出了object之外的父類都沒有__str__方法,就執行子類的__repr__方法,如果子類也沒有,
# 還要向上繼續找父類中的__repr__方法.
# 一直找不到 再執行object類中的__str__方法
8. __del__ del obj 和 垃圾回收機制回收這個對象所佔內存的時候。
比如就是某對象借用了操作系統的資源,還要通過析構方法歸還回去這時會自動調用:文件資源,網路資源
class A:
def __del__(self):
# 析構方法 del A的對象 會自動觸發這個方法
print("執行我了")
a = A()
del a # 對象的刪除 del
結果:
我執行了
如果不用del obj 也會執行,因為程序運行完垃圾回收會回收a這時還會執行__del__方法。
※想學習區塊鏈?那就用 Python 構建一個
※Python 模塊 urllib.parse
TAG:Python |