1,isinstance
判断一个类和另一个类有没有(血缘)关系。type只能检测数据类型
class A:pass class B(A):pass a = A() print(isinstance(a,A)) print(isinstance(a,B)) class A:pass class B(A):pass a = A() print(type(a)is A) print(type(a)is B)
2,issubclass 检测两个类有没有继承关系
class B:pass class C(B):pass class D(C):pass print(issubclass(C,D)) print(issubclass(D,C)) print(issubclass(B,C)) print(issubclass(C,B)) print(issubclass(D,B)) # issubclass(子类名,父类名) 如果返回True,说明有继承关系
3,最重要的反射
第一种:使用反射得到类的命名空间的名字 getattr() 和 hasattr ()
getattr() 从命名空间空间中得到这个名字对应的值。
hasattr() 判断一个命名空间中有没有这个名字 有True 无Flase
getaatr(类名,'名字')
class A: role = 'Person' def func(self): print('*'*self) print(hasattr(A,'r')) print(hasattr(A,'role')) print(hasattr(A,'func')) ret = input('>>>') if hasattr(A,ret): print(getattr(A,ret)) # getattr从A的命名空间里找一个属性 ,属性不存在会报错 if hasattr(A,ret): func = getattr(A,ret) func(1)
第二种:反射得到对象使用的方法和属性
getattr(对象名,'名字')
class Teacher: role = 'person' def __init__(self,name): self.name = name self.money = 500 def func(self): print('好好努力') alex = Teacher('alex') print(getattr(alex,'name')) getattr(alex,'func')()
第三种:使用模块中的模块名字
getattr(模块名,'名字')
import os;getattr(os,'rename')('user','user_info')
import time time.time() print(time.time()) print(getattr(time,'time')())
第四种:当前自己的模块使用自己的名字
import sys getattr(sys.modules['__main__'],名字)
def login(): print('执行login功能') def register(): print('执行register功能') import sys # 和python解释器相关的内容都在sys里 print(sys.modules['__main__']) func = input('>>>') if hasattr(sys.modules['__main__'],func): getattr(sys.modules['__main__'],func)()
5,反射的内置函数
getattr,hasattr,setattr,delattr.
getattr() 从命名空间空间中得到这个名字对应的值。
hasattr() 判断一个命名空间中有没有这个名字 有True 无Flase
setattr() 增加和改对象属性和方法
delattr() 删除对象的属性和方法
class A: def __init__(self,name): self.name = name def wahaa(self): print('ssdas') a = A('alex') a.wahaa() getattr(a,'name') # a.age = 18 # print(a.__dict__) setattr(a,'age',18) setattr(a,'name','egon') print(a.__dict__) delattr(a,'name') print(a.__dict__)
class A: def __init__(self,name): self.name = name def wahaha(self): print('wahahahahaha') def qqxing(self): print('qqqqqxing') a = A('alex') # setattr(A,'qqxing',qqxing) setattr(a,'qqxing',qqxing) # print(a.__dict__) a.qqxing(a)
6,内置方法__len__和__hash__
有一个内置函数和内置方法len()是唯一对应的关系
class A: def __init__(self,name,age,sex,hobby): self.name = name self.age = age self.sex = sex self.hobby = hobby def __len__(self): return len(self.__dict__) alex = A('alex',33,'male','girl') egon = A('egon',23,'female','抽烟') alex.money = 200 print(len(alex))
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 0 a1 = A('alex',81,'不详',2) print(hash(a1))