面向对象——isinstance/issubclass/type、反射、方法和函数的恩恩怨怨
一、isinstance/issubclass/type:
1、isinstance(obj,cls):检查obj是否是cls类的对象
class Base(object): pass class Foo(Base): pass obj1 = Foo() print(isinstance(obj1,Foo)) #检查第一个参数(对象)是否是第二个参数(类及父类)的实例 print(isinstance(obj1,Base)) #检查第一个参数(对象)是否是第二个参数(类及父类)的实例 obj2 = Foo() print(isinstance(obj2,Foo)) #检查第一个参数(对象)是否是第二个参数(类及父类)的实例 print(isinstance(obj2,Base)) #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
2、issubclass:检查sub类是否是super类的派生类
class Base(object): pass class Foo(Base): pass class Bar(Foo): pass print(issubclass(Bar,Base)) #检查第一个参数是否是第二个参数的子子孙孙类
3、type:获取当前对象是由那个类创建
class Foo(object): pass obj = Foo() #结果:<__main__.Foo object at 0x000001EF4AA48198> <class '__main__.Foo'> print(obj,type(obj)) #获取当前对象是由哪个对象创建 if type(obj) == Foo: print("obj是Foo类型") #结果:obj是Foo类型 #练习 class Foo(object): pass class Bar(object): pass def func(*args): foo_count = 0 bar_count = 0 for item in args: if type(item) == Foo: foo_count += 1 elif type(item) == Bar: bar_count += 1 return foo_count,bar_count # result = func(Foo(),Bar(),Foo()) # print(result) v1,v2 = func(Foo(), Bar(), Foo(), Bar()) print(v1,v2)
三 、 方法和函数:
1、看位置
如果函数在类中,就是方法
如果函数在类外面,就是函数
2、调用者
对象.xxx,xxx就是方法
类.xxx,xxx就是函数
xxx,xxx就是函数
3、代码判断
from types import MethodType,FunctionType class Foo: def arg(self): pass f = Foo() def check(arg): """ 检查arg是方法还是函数 :param arg: :return: """ if isinstance(arg,MethodType): print("arg是一个方法") elif isinstance(arg,FunctionType): print("arg是一个函数") else: print("不是函数也不是方法") check(f.arg) #结果:arg是一个方法 from types import MethodType,FunctionType class Foo: def arg(self): pass f = Foo() def check(arg): """ 检查arg是方法还是函数 :param arg: :return: """ if isinstance(arg,MethodType): print("arg是一个方法") elif isinstance(arg,FunctionType): print("arg是一个函数") else: print("不是函数也不是方法") check(Foo.arg) #结果:arg是一个函数
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号