>>:')#這里輸入的name是字符串#如果不知道反射,我們平常都是這么根據輸入調用的ifcontent=='name'" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python 反射

系統 1958 0

反射

描述

反射就是指在程序運行時,動態的去確定對象的類型,并且可以通過字符串的的形式去調用對應的屬性,方法,導入模塊, 是一種基于字符串的事件驅動

舉一個例子:

          
            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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲精品国产综合99久久一区 | 色综合网亚洲精品久久 | 一级毛片在线视频 | 九九这里有精品 | 亚洲综合日韩欧美一区二区三 | 鲁啊鲁啊鲁在线视频播放 | 欧美成人精品高清在线观看 | 久久精品在线播放 | 最新国产精品视频 | 夜夜嘿视频免费看 | 亚洲视频在线免费看 | 99色视频在线 | 私人小影院在线 观看 | 一级免费看 | 免费观看亚洲视频 | 欧美日韩有码 | 久久综合免费视频 | 手机看片欧美 | 最近免费中文字幕大全免费版视频 | 婷婷春色 | 日本免费一区视频 | 男人天堂视频网 | 亚洲九九精品 | 久久久免费网站 | 四虎国产精品免费久久麻豆 | 欧美国产日韩久久久 | 国产毛片在线看 | 四虎永久在线日韩精品观看 | 久久久久综合 | 欧美日韩国产一区三区 | 2020久久精品国产免费 | 伊人网在线播放 | 久久高清一级毛片 | 亚洲日韩色综合视频 | 快播视频在线 | 亚洲午夜一级毛片 | 毛片免费视频播放 | 草草在线观看 | 97se亚洲综合在线 | 欧美综合精品 | 毛片视频大全 |