1.issubclass/isinstance/type
1.issubclass:
1 class Base(object): 2 pass 3 4 class Foo(Base): 5 pass 6 7 class Bar(Foo): 8 pass 9 10 print(issubclass(Foo,Base)) 11 print(issubclass(Bar,Base)) 12 #检查第一个参数是否是第二个参数的子类
2.isinstance
1 class Base(object): 2 pass 3 4 class Foo(Base): 5 pass 6 7 obj1 = Foo() 8 print(isinstance(obj1,Foo))#检查第一个参数(对象)是否是第二个参数(类及父类)的实例 9 print(isinstance(obj1,Base))#检查第一个参数(对象)是否是第二个参数(类及父类)的实例
3.type
1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 print(obj,type(obj))#获取当前对象是由哪个类创建 7 8 if type(obj) == Foo: 9 print("obj是Foo类型")
总结:
给一个参数,判断这个类是不是有某一个指定类或其父类 issubclass
给一个参数,判断对象是不是有某一个指定类或其父类 isinstance
给一个参数,判断对象是不是有某一个指定类 type
2.方法和函数的检验
对象.xxx -->xxx就是方法
类.xxx -->xxx就是函数
xxx -->xxx就是函数
代码查看:
1 from types import MethodType,FunctionType 2 3 def check(arg): 4 """ 5 检查arg是方法还是函数 6 """ 7 if isinstance(arg,MethodType): 8 print("arg是一个方法") 9 elif isinstance(arg,FunctionType): 10 print("arg"是一个函数) 11 else: 12 print("其他")
3.反射
1.反射--模块
handler.py:
1 def f1(): 2 print("F1") 3 def f2(): 4 print("F2") 5 def f3(): 6 print("F3") 7 def f4(): 8 print("F4") 9 def f5(): 10 print("F5")
1 import handler 2 3 while True: 4 print(""" 5 系统支持的函数有: 6 1.f1 7 2.f2 8 3.f3 9 4.f4 10 5.f5 11 """) 12 val = input("请输入要执行的函数:") 13 if hasattr(handler,val): 14 func_val = getattr(handler,val)#根据字符串为参数,去模块中寻找与之同名的成员 15 if isinstance(func_val): 16 func_val() 17 else: 18 print(func_val) 19 else: 20 print("handler中不存在输入的属性名")
2.反射--面向对象
1 class Foo: 2 a = 1 3 def func(self): 4 pass 5 6 v = getattr(Foo,'func')#根据字符串为参数,去类中寻找与之同名的成员 7 print(v)
getattr 根据字符串的形式,去对象中找成员
hasattr 根据字符串的形式,去判断对象中是否有成员
setattr 根据字符串的形式,动态的设置一个成员
delattr 根据字符串的形式,动态的删除一个成员
4.是否可以被调用
1 def func(): 2 pass 3 4 class Foo(object): 5 def __call__(self,*args,**kwargs): 6 pass 7 8 def func(self): 9 pass 10 11 obj = Foo() 12 13 print(callable(func))#True 14 print(callable(Foo))#True 15 print(callable(obj))#True 16 print(callable(obj.func))#True