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)() #呼叫
輸出結果為:
>>:eattrue
>
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
>>:age22
(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)
這時輸出結果為:
>>:namewang
(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小時 第...