23反射进阶
Posted xiaozhu1993
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了23反射进阶相关的知识,希望对你有一定的参考价值。
反射
//////两个内置函数
issubclass 判断类与类之间是否有继承关系关系
语法:issubclass(Son,Foo)
判断Son是否是Foo的子类(子类不一定是‘‘父子‘‘继承,‘爷孙‘或隔代也是返回:真)
isinstance 判断对象与类之间的关系,这个类也包括父类
语法:isinstance(obj,cls)
和type的区别
# isinstance(obj,类)
# 承认继承关系的
# 类 = type(obj)
# 只承认实例化这个对象的那个类(不承认所有的继承关系)
实例
# class User(object):pass # class VIPUser(User):pass # # alex = VIPUser() # ret1 = type(alex) is User # ret2 = isinstance(alex,User) # print(ret1,ret2) # ret1 = type(alex) is VIPUser # ret2 = isinstance(alex,VIPUser) # print(ret1,ret2)
1反射对象中的内容
# 使用对象反射
# obj.属性名
# obj.方法名()
2反射类中的内容
# 使用类反射
# cls.静态变量名
# cls.类方法名()
# cls.静态方法名()
3反射本文件中的内容
4反射模块中的内容
import re # ret = re.findall(‘\d+‘,‘2985urowhn0857023u9t4‘) # print(ret) # ‘findall‘ # getattr(re,‘findall‘) # re.findall # ret = getattr(re,‘findall‘)(‘\d‘,‘wuhfa0y80aujeiagu‘) # print(ret)
# 使用模块反射
# import time
# time.time()
import time # time.time == getattr(time,‘time‘) # time.time() == getattr(time,‘time‘)()
# 两种方式
# 对象名.属性名 / 对象名.方法名() 可以直接使用对象的方法和属性
# 当我们只有字符串数据类型的内容的时候
# getattr(对象名,‘方法名‘)()
# getattr(对象名,‘属性名‘)
# 只要是a.b这种结构,都可以使用反射
# 用对象\类\模块反射,都只有以下场景
# 这种结构有两种场景
# a.b b是属性或者变量值
# getattr(a,‘b‘) == a.b
# a.b() b是函数或者方法
# a.b()
# getattr(a,‘b‘)()
# a.b(arg1,arg2)
# getattr(a,‘b‘)(arg1,arg2)
# a.b(*args,**kwargs)
# getattr(a,‘b‘)(*args,**kwargs)
如果是本文件中的内容,不符合a.b这种结构
# 直接调用func()
# getattr(sys.modules[__name__],‘func‘)()
# 直接使用类名 Person()
# getattr(sys.modules[__name__],‘Person‘)()
# 直接使用变量名 print(a)
# getattr(sys.modules[__name__],‘a‘)
# 所有的getattr都应该和hasattr一起使用
# if hasattr():
getattr()
setattr
setattr 能够通过字符串数据类型的变量名 给一个对象创建一个新的属性
setattr 只用来修改或者添加属性\变量,不能用来处理函数或者是其他方法
# a.b = value
# setattr(a,‘b‘,value)
# delattr 只用来删除 属性\变量
# del a.b 删除属性 相当于删除了a对象当中的b属性
# delattr(a,‘b‘)
内置方法
以上是关于23反射进阶的主要内容,如果未能解决你的问题,请参考以下文章
三维模型反射光照射实现物体表面高光实现(WebGL进阶04)
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情