日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面向对象 -- 反射(详细)

發布時間:2024/4/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面向对象 -- 反射(详细) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用對象反射

obj . 屬性名

obj . 方法名()

可以直接適用對象的方法和屬性

當我們只有字符串數據類型的內容的時候

可以使用

getattr(對象名,'方法名')() 來調用方法

getattr(對象名,'屬性名') 來調用屬性

1.使用對象反射 class Manager: # 管理員用戶def __init__(self,name):self.name = namedef create_course(self): # 創建課程print('in Manager create_course')def create_student(self): # 給學生創建賬號print('in Manager create_student')def show_courses(self): # 查看所有課程print('in Manager show_courses')def show_students(self): # 查看所有學生print('in Manager show_students')不用反射 alex = Manager('alex') operate_lst = ['創建課程','創建學生賬號','查看所有課程','查看所有學生'] for index,opt in enumerate(operate_lst,1):print(index,opt) num = input('請輸入您要做的操作 :') if num.isdigit():num = int(num) if num == 1:alex.create_course() elif num == 2:alex.create_student() elif num == 3:alex.show_courses() elif num == 4:alex.show_students()使用反射 alex = Manager('alex') operate_lst = [('創建課程','create_course'),('創建學生賬號','create_student'),('查看所有課程','show_courses'),('查看所有學生','show_students')] for index,opt in enumerate(operate_lst,1):print(index,opt[0]) num = input('請輸入您要做的操作 :') if num.isdigit():num = int(num)if hasattr(alex,operate_lst[num-1][1]):getattr(alex,operate_lst[num-1][1])() shop 買東西類1.瀏覽商品 scan_goods2.選擇商品 ,添加到購物車 choose_goods3.刪除商品 delete_goods class Shop:def __init__(self,name):self.name = namedef scan_goods(self):print('%s正在瀏覽商品'%self.name)def choose_goods(self):print('%s正在選擇商品'%self.name)def delete_goods(self):print('%s正在刪除商品'%self.name)s = Shop('self哥') s.choose_goods() s.scan_goods() s.delete_goods() if hasattr(s,'choose_goods'): # 判斷s對象有沒有choose_goodsfunc = getattr(s,'choose_goods') # 使用s找到choose_goods對應的內存地址print(func)func() content = input('') if hasattr(s,content): # 判斷s對象有沒有choose_goodsfunc = getattr(s,content) # 使用s找到choose_goods對應的內存地址print(func)func() opt_lst = ['scan_goods','choose_goods','delete_goods'] for index,opt in enumerate(opt_lst,1):print(index,opt) num = int(input('num :')) if hasattr(s,opt_lst[num-1]):getattr(s,opt_lst[num-1])()和反射沒關系 for i in Shop.__dict__.keys():if not i.startswith('__'):print(i)

使用類反射

cls . 屬性名

cls . 方法名()

class A:Country = '中國'@classmethoddef show(cls):print('國家 : ',cls.Country)'Country' print(getattr(A,'Country')) # print(A.Country) A.show # getattr(A,'show') 'show' getattr(A,'show')() # A.show()

使用模塊反射

import time

time.time()

import re ret = re.findall('\d+','2985urowhn0857023u9t4') print(ret) 'findall' getattr(re,'findall') # re.findall ret = getattr(re,'findall')('\d','wuhfa0y80aujeiagu') print(ret)def func(a,b):return a+bwahaha = func ret = wahaha(1,2) print(ret) import time time.time == getattr(time,'time') time.time() == getattr(time,'time')()'time' now = getattr(time,'time')() print(now)time.sleep(1) print(321) getattr(time,'sleep')(1) # time.sleep(1) print(123)

反射本文件中的內容

只要是出現在全局變量中的名字,都可以用 getattr(modules[__name__] , 字符串數據類型的名字) 來獲得

from sys import modules

語法 a = 1 b = 2 getattr(modules[__name__],'變量名')函數名 def func(a,b):print('in func',a,b)getattr(modules[__name__],'func') # func func(1,2) getattr(modules[__name__],'func')(1,2) # func 類名 class Course:def func(self):print('in func')print(Course) 'Course' print(getattr(modules[__name__],'Course')) # Course getattr(modules[__name__],'Course')() # 實例化的過程 只要是a.b這種結構,都可以使用反射 用對象\類\模塊反射,都只有以下場景 這種結構有兩種場景a.b b是屬性或者變量值getattr(a,'b') == a.ba.b() b是函數或者方法a.b()getattr(a,'b')()a.b(arg1,arg2)getattr(a,'b')(arg1,arg2)a.b(*args,**kwargs)getattr(a,'b')(*args,**kwargs) 如果是本文件中的內容,不符合a.b這種結構
如果是這種方式,引用的模塊就不是 from sys import modules , 而是直接引用 import sys直接調用func()getattr(sys.modules[
__name__],'func')()直接使用類名 Person()getattr(sys.modules[__name__],'Person')()直接使用變量名 print(a)getattr(sys.modules[__name__],'a') 所有的getattr都應該和hasattr一起使用if hasattr():getattr()

setattr

除了可以修改私有化的屬性,還可以通過字符串數據類型的變量名,給一個對象創建一個新的屬性

但 setattr 不可綁定方法

使用 setattr 創建了一個方法后,也只是創建在屬性的內存空間中,而不是類的內存空間

這種方法不是正常的方法

所以 setattr 只用來綁屬性

class A:def qqxing(self):print('qqxing')alex = A() alex.name = 'sb' print(alex.name) setattr(alex,'name','sb') # alex.name = 'sb' print(alex.name)

deleter

deleter(對象名,'屬性')

刪除對象的一個屬性

和 setattr 一樣,不能操作方法,只能操作屬性

issubclass

判斷類與類之間的關系

其實就是判斷類與類之間是否有繼承關系

issubclass(Son,Foo)

判斷Son是不是Foo的子類

輸出的結果是布爾值

object是任何類的父類,所以 insubclass(Son,object) 的結果總是 True

isinstance

判斷對象與類之間的關系,這個 '類' 也包括父類

isinstance(obj,cls)

判斷obj是否是cls或cls子類的對象

isinstance(obj,類)? 判斷時時承認繼承關系的

類 = type(obj) 也可以判斷類與對象的關系,但只承認實例化這個對象的那個類(不承認所有的繼承關系)

轉載于:https://www.cnblogs.com/biulo/p/10639859.html

總結

以上是生活随笔為你收集整理的面向对象 -- 反射(详细)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。