Python物件導向之魔法方法 雙下方法

2022-06-16 17:39:10 字數 4077 閱讀 3363

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()

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 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)

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__

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...