當前位置:
首頁 > 最新 > Python面向對象之魔法方法/雙下方法

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 構建一個
Python 模塊 urllib.parse

TAG:Python |