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

日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python 反射

系統 1969 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條評論
主站蜘蛛池模板: 庄浪县| 信阳市| 平顺县| 阜南县| 竹山县| 嵊州市| 丹江口市| 巴塘县| 班戈县| 西和县| 广丰县| 金门县| 大理市| 德庆县| 台前县| 深州市| 全南县| 康乐县| 界首市| 延川县| 交口县| 广饶县| 永仁县| 孝昌县| 衡山县| 大兴区| 宁城县| 齐齐哈尔市| 开阳县| 阿克苏市| 威海市| 丹棱县| 镇安县| 周至县| 册亨县| 连江县| 大庆市| 福海县| 湖南省| 九台市| 衡水市|