Python 入門 之 反射 通過字元串操作對象的屬性和方法 對象的角度使用反射 類的角度使用反射 當前模塊使用反射 其他模塊使用反射 反射的應用場景 ...
Python 入門 之 反射
1、反射 : (自省)
反射主要是指程式可以訪問、檢測和修改它本身狀態或行為的一種能力(自省)。
Python面向對象中的反射:通過字元串的形式操作對象的相關屬性。Python中的一切事物都是對象(都可以使用反射)
<1> getattr() 獲取
<2> setattr() 設置
<3> hasattr() 判斷是否存在
<4> delattr() 刪除
(1)通過字元串操作對象的屬性和方法
class A:
def __init__(self,name):
self.name = name
def func(self):
print("is A func")
a = A("rimo")
A.func()
print(a.name)
a.func()
(2)對象的角度使用反射
class A:
def __init__(self,name):
self.name = name
def func(self):
print("is A func")
a = A("rimo")
print(hasattr(a,"name")) # 返回 True就是說明name這個屬性在對象a中存在
print(getattr(a,"name"))
f = getattr(a,"func")
f()
setattr(a,"age",18)
print(a.__dict__)
delattr(a,"name")
print(a.__dict__)
(3)類的角度使用反射
class A:
def __init__(self,name):
self.name = name
def func(self):
print("is A func")
a = A("rimo")
print(hasattr(A,"name"))
f = getattr(A,"func")
f(11)
(4)當前模塊使用反射
def func():
print("is func")
# 當前模塊:
print(globals()["func"])
import sys
o = sys.modules[__name__] # 獲取當前模塊名對應的對象
f = getattr(o,"func")
f()
(5)其他模塊使用反射
import test # 導入模塊
test.func()
o = globals()["test"]
getattr(o,"func")()
(6)反射的應用場景
class Blog:
def login(self):
print("is login")
def register(self):
print("is register")
def comment(self):
print("is comment")
def log(self):
print("is log")
def log_out(self):
print("is log_out")
b = Blog()
func_dic = {
"1":b.login,
"2":b.register,
"3":b.comment,
"4":b.log,
"5":b.log_out
}
msg = """
1.登錄
2.註冊
3.評論
4.日誌
5.註銷
"""
choose = input(msg)
if choose in func_dic:
func_dic[choose]()
將上述代碼進行修改,減少代碼(通過字元串操作對象的屬性和方法)
class Blog:
def login(self):
print("is login")
def register(self):
print("is register")
def comment(self):
print("is comment")
def log(self):
print("is log")
def log_out(self):
print("is log_out")
b = Blog()
msg = """
login
register
comment
log
log_out
"""
while 1:
choose = input(msg)
if hasattr(b,choose):
getattr(b,choose)()
else:
print("請重新輸入!")