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) 結果: <__main__.A object at 0x105e93518> <__main__.A object at 0x105e93518> <__main__.A object at 0x105e93518> 2. __hash__ 當調用hash函數,字典的快速查詢 建立字典,集合的時候自動調用,爲何字典和集合的建立會調用? 那是由於字典和集合的建立是根據hash函數直接生成哈希值存儲的,查詢的時候是特別快的。必須有返回值,且爲整數。 class A: def __hash__(self): print('我執行了') return 1 a0 = A() hash(a0) dic = {a0: '1'} s = {a0} 結果: 我執行了 我執行了 我執行了 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__ 結果: <__main__.A object at 0x109422438> <__main__.A object at 0x1094224e0> 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__方法。