面向对象 -- 反射(详细)
使用對象反射
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
總結
以上是生活随笔為你收集整理的面向对象 -- 反射(详细)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NiftyNet开源平台使用
- 下一篇: 日程文件