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):
ifnot cls.__ins
: cls.
__ins = super().__new__
(cls)
return cls.__ins
a0 =a()
a1 =a()
a2 =a()
(a0)
(a1)
(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 1a0 =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 1a =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)
(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__
delobj 和 垃圾**機制**這個物件所佔記憶體的時候。
比如就是某物件借用了作業系統的資源,還要通過析構方法歸還回去這時會自動呼叫:檔案資源,網路資源
class
a:
def__del__
(self):
#析構方法 del a的物件 會自動觸發這個方法
print('
執行我了')
a =a()
del a #
物件的刪除 del
結果: 我執行了
如果不用del obj 也會執行,因為程式執行完垃圾**會**a這時還會執行__del__方法。
python 物件導向魔法方法
類由三個部分構成 1.類的名稱2.類的屬性3.類的方法 物件 根據已經定義的類去建立出乙個或多個物件 格式為 物件名 類名 建立物件 新增和獲取物件的屬性 魔法方法 init 如果類沒有寫init方法,python會自動穿件,但不執行任何操作,如果為了能夠在完成自己想要的功能,可以直接定義init方...
物件導向(五) 魔法方法
魔法方法 定義 以雙下劃線開頭和結尾的方法,這些方法不允許開發者自己定義 特點 不需要顯式的呼叫,每乙個魔法方法都具有特定的觸發時機 目前說過的魔法方法 1 構造和初始化方法 2 比較運算子 3 算術運算子 4 復合運算子 5 物件列印 6 其他方法 print 物件被呼叫 return 10 de...
物件導向 魔法方法 str
class hero object 定義了乙個英雄類,可以移動和攻擊 def init self,name,skill,hp,atk,armor init 方法,用來做變數初始化 或 賦值 操作 英雄名 self.name name 例項變數 技能 self.skill skill 生命值 self...