python學習第七週之反射

2022-07-19 14:06:23 字數 3232 閱讀 4412

1.反射:通過字串對映或修改程式執行時的狀態。

有四個方法:hasattr() getattr() setattr() delattr()

2.(1)如以下程式:

hasattr() 判斷有沒有屬性 ,hasattr(d,choice)分別為 物件名 字串

getattr() 呼叫該屬性

class dog(object):

def __init__(self,name):

self.name=name

def eat(self):

print("%s is eating " % self.name)

d=dog("chen") #例項化乙個狗

choice=input(">>:").strip()

print(hasattr(d,choice)) #判斷有沒有 物件名,字串形式

print(getattr(d,choice)) #對映出記憶體物件位址

getattr(d,choice)() #呼叫

輸出結果為:

>>:eat

true

>

chen is eating

(2)可以將其寫入for迴圈,如果沒有,就新增方法

class dog(object):

def __init__(self,name):

self.name=name

def eat(self,food):

print("%s is eating " % self.name,food)

d=dog("chen") #例項化乙個狗

choice=input(">>:").strip()

if hasattr(d,choice):

func=getattr(d,choice)

func("rice")

(3)動態裝配乙個方法:動態的將類外面的方法裝配到類裡面

如果我們要新增新的屬性,就要用到 setattr()方法

在類外面定義乙個方法bulk,使用setattr新增乙個新的方法

def bulk(self):

print("%s is yelling..." %self.name)

class dog(object):

def __init__(self,name):

self.name=name

def eat(self,food):

print("%s is eating " % self.name,food)

d=dog("chen") #例項化乙個狗

choice=input(">>:").strip()

if hasattr(d,choice):

func=getattr(d,choice)

func("rice")

else:

setattr(d,choice,bulk)

d.talk(d) #動態裝飾乙個方法,bulk中沒有寫self,需要將自己傳進去;動態的將類外面的方法裝配到類裡面;bulk相當於是乙個變數名

輸出結果為:輸入talk,輸出chen is yelling...

(4)動態裝配乙個屬性

def bulk(self):

print("%s is yelling..." %self.name)

class dog(object):

def __init__(self,name):

self.name=name

def eat(self,food):

print("%s is eating " % self.name,food)

d=dog("chen") #例項化乙個狗

choice=input(">>:").strip()

if hasattr(d,choice):

func=getattr(d,choice)

func("rice")

else:

setattr(d,choice,22) #setattr(d,choice,none) #動態裝飾乙個屬性

print(getattr(d,choice))

這時輸出結果為:將22賦給了輸入的屬性22;如果輸入money,則將22賦給money

>>:age

22

(5)修改名字使用setattr

def bulk(self):

print("%s is yelling..." %self.name)

class dog(object):

def __init__(self,name):

self.name=name

def eat(self,food):

print("%s is eating " % self.name,food)

d=dog("chen") #例項化乙個狗

choice=input(">>:").strip()

if hasattr(d,choice):

setattr(d,choice,"wang") #修改,setattr給物件新增乙個新的屬性;修改name

else:

setattr(d,choice,22) #setattr(d,choice,none) #動態裝飾乙個屬性

print(getattr(d,choice))

print(d.name)

這時輸出結果為:

>>:name

wang

(6)刪除

if hasattr(d,choice):

delattr(d,choice) #刪除

else:

setattr(d,choice,22) #setattr(d,choice,none) #動態裝飾乙個屬性

print(getattr(d,choice))

print(d.name)

輸入name後,執行報錯。

總結:hasattr(obj,name_str) , 判斷乙個物件obj裡是否有對應的name_str字串的方法

getattr(obj,name_str), 根據字串去獲取obj物件裡的對應的方法的記憶體位址

setattr(obj,'y',z), 相當於obj.y = v

delattr

第七周學習總結

這次考核雖然算是結束了,但是對於我來說還遠遠沒有結束。通過這次考核,又暴露了出來我在學習方法和其他方面上的一些問題。首先是在學習方法方。現在想想,就我剛開始在小組學習的那一段時間來說,我認為我的學習方法其實就有一定的問題,比如對於問題只知道該怎麼解決,卻沒有去深究為什麼要這樣解決,還有沒有其他的解決...

第七周學習總結

這周我們學習了多型,什麼是多型呢?多型按字面意思就是 多種狀態 在物件導向語言中多型就是介面多種不同的實現方式。那多型的優點呢?就是消除型別之間的耦合關係。多型存在的三個條件 父類引用指向子類物件 使用時 動態繫結 繼承 多型以繼承為基礎。重寫 按照契約形成另一種形態 特殊性 後面學到了base關鍵...

第七周學習小結

上週部落格互評情況 做事情真的不能夠拖延,這周周五的實驗做了很長時間,中間各種狀況不斷。結果最後第九章的學習任務也沒有完成,但是下週如果停下來補第九章的內容又會影響到之後的學習,以後真的要早學早做。行數 新增 累積 部落格量 新增 累積 學習時間 新增 累積 重要成長 目標5000行 400小時 第...