23反射进阶

Posted xiaozhu1993

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了23反射进阶相关的知识,希望对你有一定的参考价值。

反射

//////两个内置函数

issubclass    判断类与类之间是否有继承关系关系

语法:issubclass(Son,Foo)

判断Son是否是Foo的子类(子类不一定是‘‘父子‘‘继承,‘爷孙‘或隔代也是返回:真)

isinstance  判断对象与类之间的关系,这个类也包括父类

语法:isinstance(obj,cls)

和type的区别

# isinstance(obj,类)
    # 承认继承关系的

# 类 = type(obj)

 # 只承认实例化这个对象的那个类(不承认所有的继承关系)

实例

技术图片type和isinstance
# 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‘)()
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++的函数耗时以及代码片段耗时详情

面向对象进阶一

Python入门自学进阶——7--类与对象-异常反射单例模式

Atom编辑器入门到精通 Atom使用进阶

Python基础-week06 面向对象编程进阶