面向對象—反射
阿新 • • 發佈:2018-04-26
ins pytho __main__ pan sub ole set person 內置函數
內置函數:
1.isinstance:判斷一個對象和一個類有沒有血緣關系
class A:pass class B(A):pass a = B() print(isinstance(a,B)) #True print(isinstance(a,A)) #True print(type(a) is B) #True print(type(a) is A) #False
2.issubclass(子類名,父類名):檢測繼承關系,返回True說明與繼承關系
class A:pass class B(A):pass class C(B):pass print(issubclass(C,B))#Trueprint(issubclass(C,A))#True
反射
反射:通過字符串的形式操作對象相關的屬性,使用字符串數據類型的變量名訪問一個命名空間中的名字,找一個屬性直接就可以找到這個屬性的值,找一個方法找到的是這個方法的內存地址。
反射的4個內置函數:
1.hasatter:判斷一個命名空間裏是否有一個屬性或方法
class A: role = ‘Person‘ def func(self): print(‘*‘*self) print(hasattr(A,‘r‘)) # False print(hasattr(A,‘role‘)) # True print(hasattr(A,‘func‘)) # True ret = input(‘>>>‘) if hasattr(A,ret): print(getattr(A,ret)) if hasattr(A,ret): func = getattr(A,ret) func(12)
2.getatter:從一個命名空間裏獲取一個屬性或方法的值,方法需要調用。
class A: role = ‘Person‘ def func(self): print(‘*‘*self) ret = input(‘>>>‘)print(getattr(A,‘role‘)) #從A的命名空間裏找一個屬性,直接可以找到這個屬性的值 f = getattr(A,‘func‘);f(3) #從A的命名空間裏找一個方法,找到的是這個方法的內存地址 A.func(1)
- 類使用類命名空間中的名字:getattr(類名,‘名字‘)
- 對象使用對象能用的方法和屬性:getattr(對象名,‘名字‘)
-
class A: role = ‘Person‘ def __init__(self): self.money = 500 def func(self): print(‘*‘*5) a = A() getattr(a,‘func‘)() print(getattr(a,‘money‘)) #getattr(對象名,‘名字‘)
- 模塊使用模塊中的名字:getattr(模塊名,‘名字‘)
-
import time time.time() print(time.time) print(getattr(time,‘time‘)) import os getattr(os,‘rename‘)(‘user‘,‘user_info‘)
- 自己所在的模塊中使用自己的名字:impoart sys getattr(sys.modules[‘__main__‘],名字)
-
def login(): print(‘執行login功能‘) def register(): print(‘執行register功能‘) import sys #和python解釋器相關的內容都在sys模塊裏 print(sys.modules[‘__main__‘]) # 找到自己所在的模塊(py文件) func = input(‘>>>‘) getattr(sys.modules[‘__main__‘],func)()
3.setatter:增加和修改
4.delatter:刪除
class A: def __init__(self,name): self.name = name def wahaha(self): print(‘wahahaha‘) a = A(‘alex‘) # a.age = 18 # print(a.__dict__) setattr(a,‘age‘,18) # 增加一個屬性 print(a.__dict__) # {‘age‘: 18, ‘name‘: ‘alex‘} setattr(a,‘name‘,‘taibao‘) # 修改一個屬性 print(a.__dict__)# {‘age‘: 18, ‘name‘: ‘taibao‘} delattr(a,‘age‘) #刪除一個屬性 print(a.__dict__) #{‘name‘: ‘taibao‘}
內置方法
len()內置方法和內置函數__len__是對應的關系
class A: def __init__(self,name,age,sex,cls): self.name = name self.age = age self.sex = sex self.cls = cls def __len__(self): return len(self.__dict__) a = A(‘alex‘,18,‘man‘,2) print(len(a)) # 4 a.hobby = ‘燙頭‘ print(len(a)) # 5
hash()內置方法和內置函數__hash__是對應的關系
class A: def __init__(self,name,age,sex,cls): self.name = name self.age = age self.sex = sex self.cls = cls def __hash__(self): return 1 a = A(‘alex‘,18,‘man‘,2) print(hash(a)) # 1
面向對象—反射