isinstance / issubclass / type, 方法和函数, 反射
一.issubclass / type / isinstance
issubclass: 检查第一个参数是否是第二个参数的子类或子类的子类
class Base(object): pass class Foo(Base): pass class Bar(Foo): pass print(issubclass(Bar, Base))
type: 获取当前对象是由那个类创建
class Foo(object): pass obj = Foo() print(obj, type(obj)) if type(obj) == Foo: print('obj是Foo类型')
isinstance: 检查第一个参数(对象)是否是第二个参数(类及父类)的实例
class Base(object): 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))
二.方法和函数
对象.xxx --> xxx就是方法
类.xxx --> xxx就是函数
xxx --> xxx就是函数
打印看是方法还是函数
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('不知道是什么')
三.反射
isinstance(getattr(), FunctionType)
getattr # 根据字符串的形式,去对象中找成员。
hasattr # 根据字符串的形式,去判断对象中是否有成员。
setattr # 根据字符串的形式,动态的设置一个成员(内存)
delattr # 根据字符串的形式,动态的删除一个成员(内存)
应用一:
from types import FunctionType import handler # 同目录的py文件 while True: print(""" 系统支持的函数有: 1. f1 2. f2 3. f3 4. f4 5. f5 """) val = input("请输入要执行的函数:") # val = "f1" 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中不存在输入的属性名')
应用二:
class Account(object): func_list = ['login', 'logout', 'register'] def login(self): """ 登录 :return: """ print('登录111') def logout(self): """ 注销 :return: """ print('注销111') def register(self): """ 注册 :return: """ print('注册111') def run(self): """ 主代码 :return: """ print(""" 请输入要执行的功能: 1. 登录 2. 注销 3. 注册 """) choice = int(input('请输入要执行的序号:')) func_name = Account.func_list[choice - 1] func = getattr(Account,func_name) # Account.login func(self) # 或者 func = getattr(self, func_name) # self.login func()