反射
一.issubclass/type/isinstance
1.issubclass :检查第一个参数是否是第二个参数的子子孙孙类
class Base: pass class Foo(Base): pass class Bar(Foo): pass print(issubclass(Bar,Foo)) #结果:True
2.type:获取当前对象是有那个类创建
class Foo: pass obj = Foo() print(obj,type(obj)) #获取当前对象是有那个类创建. if type(obj ) ==Foo: print("obj是Foo类型")
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)
3.isinstance: 检查第一个参数(对象)是否是第二个参数的实例.
class Base: pass class Foo(Base): pass obj1 = Foo() print(isinstance(obj1,Foo)) #检查第一个参数(对象)是否是第二个参数(类及父类)的实例 print(isinstance(obj1,Base)) #检查第一个参数(对象)是否是第二个参数(类及父类)的实例 obj2 = Base() print(isinstance(obj2,Foo)) #检查第一个参数(对象)是否是第二个参数(类及父类)的实例 print(isinstance(obj2,Base)) #检查第一个参数(对象)是否是第二个参数(类及父类)的实例 # 结果:True True False True
给一个参数,判断对象是不是由某一个指定类? type
type(obj) ==Foo
给一个参数,判断対象是不是由某一个指定类或其父类? instance(obj,Foo)
二.方法和函数
称谓: 类 , 方法
外 , 函数
对象.xxx ==> xxx就是方法
类.XXX ==> xxx就是函数
xxx ==> xxx就是函数
打印查看:
function: 函数
mathod: 方法
from types import MethodType,FunctionType def check(arg): """ 检查arg是方法还是函数 :param arg: :return: """ if isinstance(arg,MethodType): print("arg是一个方法") elif isinstance(arg,FunctionType): print("arg是一个函数") else: print("不知道")
三.反射
v = getattr(obj,"func") 根据字符串为参数(第二个参数),去对象(第一个参数)中寻找与之同名的成员.
getattr: 根据字符串的形成,去对象中找成员.
hasattr: 根据字符串的形成,去判断对象中是否有成员.
setattr: 根据字符串的形成,动态的设置一个成员(内存)
delattr: 根据字符串的形成, 动态的删除一个成员(内存)
#handler.py f0 = 9 def f1(): print("F1") def f2(): print("F2") def f3(): print("F3") def f4(): print("F4") def f5(): print("F5") ############################ from types import FunctionType import handler while True: print(''' 系统支持的函数有 1.f1 2.f2 3.f3 4.f4 5.f5''') val = input("请输入要执行的函数:") if hasattr(handler,val): func_or_val = getattr(handler,val) if isinstance(func_or_val,FunctionType): func_or_val() else: print(func_or_val) else: print("handler中不存在输入的属性名")