一、issubclass/type/isinstance
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(Bar,Base)) #检查第一个参数是否是第二个参数的 子子孙孙类
2、type:判断当前对象是由哪个类创建的
1 class Base:2 pass3 4 obj=Base()5 if type(obj)==Base:6 print("当前对象是Base类创建的")
3、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)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。10 11 12 obj2 = Base()13 print(isinstance(obj2,Foo)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。14 print(isinstance(obj2,Base)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。
二、方法和函数
1、判断是方法还是函数1 from type import MethodType FunctionType 2 def check(arg): 3 if isinstance(MethodType,arg): 4 print("这是方法") 5 if isinstance(FunctionType,arg): 6 print("这是函数") 7 else: 8 print("什么也不是") 9 10 def func()11 pass12 13 class Foo:14 def tital(self):15 pass16 @staticmethod17 def hand()18 pass19 20 check(func) #判断func是函数还是方法21 22 obj=Foo()23 check(obj.tital) # 如果是Foo.tital,则结果是一个函数24 check(obj.hand) # 如果是Foo.hand,则结果是一个函数
简单一句话:如果是 格式是:类.xxx 则xxx是函数,如果格式是:对象.xxx,则xxx是方法
2、特点1 class Foo(object): 2 3 def f1(self): 4 pass 5 6 def f2(self): 7 pass 8 9 def f3(self):10 pass11 12 13 obj = Foo()14 Foo.f1(obj) # 把f1当做函数 需要手动传self值15 16 obj = Foo()17 obj.f1() # 把f1当做方法,自动传self值
3、练习题
1 class Foo(object): 2 3 def f1(self): 4 pass 5 6 def f2(self): 7 pass 8 9 def f3(self):10 pass11 12 list_display = [f1,f2]13 14 obj = Foo()15 Foo.list_display.append(obj.f3)16 17 for item in Foo.list_display:18 print(item)19 20 #结果:21 #function Foo.f1 at 0x0000020AA92BCB70>22 #23 # >
三、判断是否可以被调用
类()、函数()、方法()、对象(),都可以可以被调用callable()
1 def func() 2 pass 3 4 class Foo: 5 def titer(self): 6 pass 7 8 def __call__(self, *args, **kwargs): 9 pass10 11 obj=Foo()12 13 print(callable(Foo))14 print(callable(func))15 print(callable(obj))16 print(callable(obj.titer))
四、反射
1、反射示例——模块
1 ###handre### 2 f0 = 9 3 4 def f1(): 5 print('F1') 6 7 def f2(): 8 print('F2') 9 10 def f3():11 print('F3')12 13 def f4():14 print('F4')15 16 def f5():17 print('F5')
1 from types import FunctionType 2 import handre 3 while True: 4 print( 5 """系统支持的函数有: 6 1,f1 7 2,f2 8 3,f3 9 4,f410 5,f5 11 """12 )13 val=input("请选择要运行的函数")14 15 if hasattr(handre,val):16 get_atter=getattr(handre,val)17 if isinstance(get_atter,FunctionType):18 get_atter()19 else:20 print(get_atter)21 22 else:23 print("请输入正确的格式")
2、反射示例——面向对象
1 class Foo: 2 f0 = 9 3 num_list = ["f1", "f2", "f3", "f4", "f5"] 4 def f1(self): 5 print('F1') 6 7 def f2(self): 8 print('F2') 9 10 def f3(self):11 print('F3')12 13 def f4(self):14 print('F4')15 16 def f5(self):17 print('F5')18 def run(self):19 20 while True:21 print("""系统支持的函数有:22 1,f123 2,f224 3,f325 4,f426 5,f527 """)28 num=int(input("请输入序号"))29 name=Foo.num_list[num-1]30 method_name=getattr(Foo,name) # 根据字符串到指定的类去找31 method_name(self) # 类 调用需要手动传参32 33 #method_name=getattr(self,name) # 根据字符串到指定的对象去找34 #method_name() # 自动传参35 36 obj=Foo()37 obj.run()