反射(reflection):指的是在執行時獲取型別的定義資訊。
本質:利用字串的形式去物件(模組)中操作(查詢/獲取/刪除/新增)成員,是一種基於字串的事件驅動。
簡單來說,python可以通過字串來操作物件(類/方法/模組的)屬性和方法(也可操作類),這就是python的反射。
在python中例項化物件、類、當前模組、其他模組可以使用反射機制。
從其他模組獲取屬性和方法和類
從當前模組獲取屬性和方法和類
# 刪除上面剛給test模組新增的類a
delattr
(test,
"a")
a2 = test.a(
)# 拋異常
刪除操作也好理解。
classc:
def__init__
(self)
: self.__name =
"ccc"
defget_id
(self)
:print
(self.__id)
# 假裝可以設定私有方法,其實不行
defprint_page
(self):if
(hasattr
(c.print_page,
"page"))
:# 有這個屬性時列印出來
print
("page:"
,getattr
(c.print_page,
"page"))
c = c(
)
給__init__
方法新增的屬性,算作區域性變數而不是類的屬性
page =
10setattr
(c.__init__,
"self.page"
, page)
setattr
(c.__init__,
"page"
, page)
print
(hasattr
(c,"self.page"))
# false
print
(hasattr
(c,"page"))
# false
print
(hasattr
(c,"self.page"))
# false
print
(hasattr
(c,"page"))
# false
# print(c.page) # 拋異常
# print(c.page)
print
(hasattr
(c.__init__,
"page"))
# true 因此page這時是區域性變數
print
(hasattr
(c.__init__,
"page"))
# true
# 可以給類中普通方法新增方法
setattr
(c.print_page,
"page"
, page)
c.print_page(
)# 10
但是可以獲取到私有方法
print
(hasattr
(c,"__name"))
# false
print
(hasattr
(c,"_c__name"))
# true 這有這樣才能
print
(c._c_name)
# ccc
那麼引申出
classd:
def__init__
(self)
:print
("初始化d類"
) self.page =
10 self.__id =
2def
print_id
(self)
:print
(self.__id)
defprint_id2
(self)
:print
(self._d_id)
defprint_word
(self)
:print
("列印word:"
+ self.__word)
def__init__
(self, name=
"ddd"):
print
("d類初始化"
) self.name = name
self.__id =
1 self._d_word =
"word"
# 這樣可以曲線新增給__init__新增私有屬性
_d_text =
"text"
# 這不算類的屬性,只能算區域性變數
d = d(
)# 初始化d類
print
(d.page)
# 10
# 設定初始化方法,會覆蓋掉原有的初始化方法
setattr
(d,"__init__"
, __init__)
d2 = d(
)# d類初始化
print
(d.page)
# 10
# print(d2.page) # 新例項化物件沒有page屬性
# 檢視私有屬性
# print(d.__id)
print
(d._d__id)
# 2# 看看新替換的__init__方法的私有屬性可起作用
print
(d2.__id)
# 但這時__id就不是私有方法了,當作普通方法來了
# d2.print_id() # 拋異常
# d2.print_id2() # 拋異常
# 所以想這樣設定私有屬性,這能_d__word這樣類設定
print
(d2._d__word)
# word
d2.print_word(
)# 列印word:word
# print(d2._d_text) # 拋異常,找不到這個屬性
可以通過類的__dict__
來檢視物件有哪些屬性
print
(d.__dict__)
# print
(d2.__dict__)
#
可以發現修改__init__
初始化方法後,物件的屬性變了,也可以動態新增私有屬性了。
另外,也可以通過__init__
來檢視類有哪些屬性
print
(d.__dict__)
""""""
不能直接給類新增私有屬性,但是可以單獨寫乙個__init__(self,...)
方法,裡面按私有方法的存在方式_類名__屬性名
定義私有屬性,再把該方法替換原有的類中的方法。
python的私有方法其實就是_類名__私有方法名
這樣儲存的。
第四周作業
第四周實驗作業 1.完成課本每乙個程式設計題。要求先畫出流程演算法圖或n s圖,然後程式設計實現,有可能的話使用兩種以上方法 1.1求自然對數e的近似值 include using namespace std int main cout 1.2求圓周率 的近似值 include using name...
第四周作業
實驗作業1.完成課本每乙個程式設計題。要求先畫出流程演算法圖或n s圖,然後程式設計實現,有可能的話使用兩種以上方法 2.程式設計求 百錢百雞 問題。雞翁一值錢五,雞母 一值錢三,雞雛三值錢一。百錢買百雞,問雞翁 雞母 雞雛各幾何?3.程式設計輸入乙個整數,計算它是幾位數字,分別輸出每一位數字,並輸...
第四周作業
實驗作業1.完成課本每乙個程式設計題。要求先畫出流程演算法圖或n s圖,然後程式設計實現,有可能的話使用兩種以上方法 2.程式設計求 百錢百雞 問題。雞翁一值錢五,雞母 一值錢三,雞雛三值錢一。百錢買百雞,問雞翁 雞母 雞雛各幾何?3.程式設計輸入乙個整數,計算它是幾位數字,分別輸出每一位數字,並輸...