反射
描述
反射就是指在程序運行時,動態的去確定對象的類型,并且可以通過字符串的的形式去調用對應的屬性,方法,導入模塊, 是一種基于字符串的事件驅動
舉一個例子:
class Student:
def __init__(self):
self.name = 'mhy'
self.price = '5000'
obj1 = Student()
content = input('>>>:') # 這里輸入的name是字符串
# 如果不知道反射,我們平常都是這么根據輸入調用的
if content == 'name':
print(obj1.name)
elif content == 'price':
print(obj1.price)
但是上面的方法,我們如果要調用成百上千的個方法或者屬性,不得死了,所以就有了反射這種方法
python提供了幾個內置函數來解決這種事情
getattr()
hasattr()
例如上面的例子,我們現在可以這樣做,代碼如下
對象的反射
-
getattr(對象,字符串形式屬性或者方法名)
返回對象中屬性名對應的值 -
hasattr(對象,字符串形式屬性或者方法名)
返回的是一個bool
值,判斷對象中是否存在屬性
反射屬性
?
val = getattr(對象,'屬性名')
val就是屬性的值
class Student:
def __init__(self):
self.name = 'mhy'
self.price = '5000'
obj1 = Student()
content = input('>>>:')
if hasattr(obj1, content): # 判斷obj1對象中是否存在該屬性
ret = getattr(obj1,content) # 對象和輸入的字符串
print(ret)
反射方法
方法的反射如果我們使用上面屬性的反射的話,會有問題
比如屬性是不需要加括號的,直接會返回值,但是方法不加括號只會返回內存地址,但是我們如何判斷當前是否是個方法,還是個屬性呢.這里要用到判斷了
callable()
: 判斷參數是否可調用
val = getattr('對象','方法名')
?
val
就是方法的地址
?
val()
==> 調用方法
代碼如下:
class Student:
def __init__(self):
self.name = 'mhy'
self.price = '5000'
def show_name(self):
print(self.name,self.price)
obj1 = Student()
content = input('>>>:')
if hasattr(obj1, content):
ret = getattr(obj1,content)
if callable(ret): # 判斷ret是否可調用,因為有可能是一個內存地址
ret()
else:
print(ret)
類的反射
class A:
role = 'China'
print(getattr(A,'role')) # 用類獲取類的變量
模塊的反射
# 模塊的反射
import time
print(time.time())
print(getattr(time,'time')())
反射本質
:
a.b ===== getattr(a,'b')
反射使用:
name = 'alex'
age = 84
def func():
print('wahaha')
class Student():pass
import sys
# 反射變量
ret1 = getattr(sys.modules[__name__],'name')
ret2 = getattr(sys.modules[__name__],'age')
# 反射函數
getattr(sys.modules[__name__],'func')()
# 反射類
print(getattr(sys.modules[__name__],'Student'))
學生例子
class Studnet:
opt_lst = [
('查看可選課程', 'show_courses'),
('選擇課程', 'choose_course'),
('查看已選課程', 'show_selected_course'),
('退出', 'quit')
]
def __init__(self,name):
self.name = name
self.courses = []
def show_courses(self):
print('查看一共有多少門課程')
def choose_course(self):
print('選擇課程')
def show_selected_course(self):
print('查看已經選擇的課程')
def quit(self):
print('退出')
stu = Studnet('alex')
for index,opt in enumerate(Studnet.opt_lst,1):
print(index,opt[0])
num = int(input('請輸入您要選擇的操作序號:'))
if hasattr(stu,Studnet.opt_lst[num-1][1]):
getattr(stu,Studnet.opt_lst[num-1][1])()
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
