Python面相物件魔法方法

2021-10-01 23:12:50 字數 4691 閱讀 1501

疑問:面相物件是什麼?到底應該怎麼用?

物件導向:分(類和物件)–>分(特徵和屬性方法)–>總(專案收尾)

什麼是魔法方法:魔法方法是一種特殊的方法,從object繼承而來,在型別中體現為兩個下劃線開頭和結尾的方法,有一地你給的特殊作用,如__str__()方法用於在直接列印輸出物件時,展示給使用者的字串資訊,預設情況下是記憶體位址,開發人員可以按照自己的需要進行自定義輸出。

__class__  : 魔法屬性,用於檢視當前物件的型別,類似type

()操作

__delattr__ :魔法方法,用於刪除當前物件的乙個屬性

__dict__ :魔法方法,將物件中的資料按照字典的形式輸出

__dir__ :魔法方法,和dir

() 類似,檢視當前型別/物件,都有哪些操作

__doc__ :魔法屬性,用於檢視當前物件的文件注釋

# **1:比較兩個人的年齡大小

class

person

:"""人"""

def__init__

(self, name, age)

:self.name = name

self.age = age

p1 = person(

"大牧",18

)p2 = person(

"小李",16

)# 比較兩個人的年齡

print

(p1.age > p2.age)

__ge__(other)

:對應的比較符號:>

|<

__eq__(other)

:對應的比較符號:==|

!=__lt__(other)

:對應的比較符號:

<

__le__(other)

:對應的比較符號:

<

=

>

: grant than : gt

<

: less than : lt

==: equals : eq

!=:not equals :ne

重寫魔法方法

#** 1: 比較兩個人的年齡大小

class

person

:"""人"""

def__init__

(self,name,age)

: self.name = name

self.age = age

def__ge__

(self,other)

:#判斷大小

if self.age >= other.age

return

true

return

false

def__gt__

(self,other)

:if self.age > other.age:

return

false

def__eq__

(self,other)

:if self.name == other.name and self.age == other.age:

return

true

return

false

p1 = person(

"席少",20

)p2 = person(

"小王",16

)p3 = person(

"小王",16

)#比較兩個人的年齡

print

(p1.age > p2.age)

#模擬生活中兩個人的比較,預設比較的是年齡

print

(p1 >= p2)

print

(p1 > p2)

print

(p1 == p2)

print

(p3 == p2)

python中的集合,再新增乙個資料到集合中時,會通過__hash__(

)計算這個物件的雜湊值,通過雜湊值在集合中已經存在的資料中進行檢索,如果相同雜湊值的物件不存在直接新增,如果已經存在則繼續呼叫物件的__eq__(

)方法判斷要新增的對下哪個和已經新增的物件是否屬於同乙個物件,如果是同乙個物件則表示資料重複不允許新增,如果不是同乙個物件則允許新增。

"""

需求:將自定義的使用者物件資料儲存到集合中,**預設身份證號碼相同的使用者是同乙個人**。

"""class

person

:def

__init__

(self,name,reg_no)

: self.name = name

self.reg_no = reg_no

def__str__

(self)

:return f"<>"

def__repr__

(self)

:return f"<>"

def__hash__

(self)

:return f"<>"

def__eq__

(self,other)

:if self.name == other.name and self.reg_no == other.reg_no:

return

true

return

false

if __name__ ==

"__main__"

: p1 = person(

"席少"

,"101"

) p2 = person(

"小王"

,"102"

) p3 = person(

"小張"

,"103"

) p4 = person(

"小張"

,"103"

)#集合去重

s =set(

) s.add(p1)

s.add(p2)

s.add(p3)

s.add(p4)

print

(s)

深拷貝: import copy; copy.deepcopy(

) source = copy.copy(target) :將target淺拷貝乙份賦值給source

source = copy.deepcopy(target) :將target深拷貝乙份賦值給source

反射:是生活中的反射接觸最多的就是光線的反射,理解的更多的是鏡子,反射其實就是通過一段字元資訊,得到乙個物件的結果,就類似生活中女朋友給男朋友說想要乙個ysl口紅,到某個節日的時候確實得到了這個口紅。這個過程就是反射。

**中的反射就是通過字串資訊,得到型別中/模組中的乙個python物件

hasattr

(obj,attribute)

#物件obj是否包含某個指定的attribute屬性

getattr

(obj,attribute)

delattr

(obj,attribute)

setattr

(obj,attribute)

"""

反射方法:通過乙個字串,反向查詢型別中是否包含指定的屬性資料

"""class

person

:def

__init

(self,name)

: self.name = name

defeat(self,food)

:print

(f"要吃飯了..."

)#常規呼叫:我們知道型別中有什麼屬性和方法

p = person(

"席少"

)print

(p.name)

p.eat(

"紅燒肉"

)#反射呼叫:場景遠端呼叫,不知道對方的型別中有什麼屬性和方法

#對方只是提供了 有name 屬性,有eat()方法。具體是否包含不知道

p2 = person(

"席少"

)#判斷物件中是否包含name屬性

ifhasattr

(p2,

"name"):

#使用name屬性,通過判斷的方式避免了錯誤的發生

print

(p2.name)

#反射呼叫

name =

getattr

(p2,

"name"

)print

(name)

總結:反射,就是通過字串來反向得到物件的屬性資料,主要應用場景就是在資料介面遠端呼叫時不知道型別中是否包含具體的屬性或者方法,通過反射的形式得到屬性和方法進行執行,避免了屬性和方法不存在的錯誤導致程式崩潰!

p3 =person(

"席少"

)#常規呼叫:不清楚person中是否有sleep().直接呼叫導致程式崩潰

#p3.sleep()

#反射呼叫:不清楚person中是否有sleep(),反射呼叫不會導致程式出現問題

ifhasattr

(p3,

"sleep"):

p3.sleep(

)

python 物件導向魔法方法

類由三個部分構成 1.類的名稱2.類的屬性3.類的方法 物件 根據已經定義的類去建立出乙個或多個物件 格式為 物件名 類名 建立物件 新增和獲取物件的屬性 魔法方法 init 如果類沒有寫init方法,python會自動穿件,但不執行任何操作,如果為了能夠在完成自己想要的功能,可以直接定義init方...

Python魔法方法 基本的魔法方法

new cls 1.new 是在乙個物件例項化時候所呼叫的第乙個方法 2.他的第乙個引數是這個類,其他的引數是用來直接傳遞給 init 方法 3.new 決定是否使用該 init 方法,因為.new 可以直接呼叫其他類的構造方法,或者返回別的例項物件來作為本類的例項,如果 new 沒有返回例項物件,...

python 魔法方法

魔法方法具有一定的特徵 new cls class capstr str def new cls,string 修改新類裡的new方法,需傳入乙個引數 string string.upper return str.new cls,string 用父類裡的new方法進行返回,直接飯後構造後的物件def...