python-37-各种反射

Posted 广深-小龙 --扬帆起航!

tags:

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

前言

python中的一切事物都是对象,都可以使用反射!python面向对象中的反射是:通过字符串的形式操作任何对象相关的类、方法及属性。

反射对象中的属性和方法,有这几个方法:

  • hasattr()
  • getattr()
  • setattr()
  • delattr()

1、反射对象的属性,getattr:

# 1、反射对象的属性:
class A:
    dic={
        \'a\':1,
        \'b\':2,
        \'c\':\'\'}
    def __init__(self,name):self.name=name
res=A(\'广深小龙\')
r=getattr(res,\'name\')       # 查看属性:(实例化对象,属性变量名)
print(r)

 2、反射对象的方法,getattr:

# 2、反射对象的方法:
class A:
    dic={
        \'a\':1,
        \'b\':2,
        \'c\':\'\'}
    @staticmethod
    def func():
        return \'qasdasdasd\'
r1 = getattr(A,\'func\')
print(r1)           # 拿到的是func方法
print(r1())         # 可以调用到函数

 3、反射类的属性,getattr:

# 3、反射类的属性:
class A:
    dic = {
        \'a\':\'ff\',
        \'b\':\'func\'}
print(getattr(A,\'dic\'))

 4、反射类的方法,getattr:

# 4、反射类的方法:
class A:
    dic = {
        \'a\':\'ff\',
        \'b\':\'func\'}
    @staticmethod
    def ff():return \'调用了ff方法\'
    @classmethod
    def func(cls):return \'调用了func方法\'
    def hub(self):return \'调用了hub方法\'
print(getattr(A,\'ff\')())
print(getattr(A(),\'hub\')()) # 注意:A()是因为hub是普通类的方法需要传self

if hasattr(A(),\'hub\'):  # hasattr 判断是否存在,返回bool
    print(getattr(A,\'func\')())

5、反射模块的属性与方法,getattr:
内置函数、自己定义的函数都可以使用

# 5、反射模块的属性与方法
# 内置函数、自己定义的函数都可以使用
import test
getattr(test,\'r\')               # 反射模块的属性
func=getattr(test,\'func\')      # 反射模块的方法
print(func())

 6、反射自己模块中的变量与方法,getattr:

# 6、反射自己模块中的变量与方法
name = \'广深小龙\'
def func():
    return \'func函数\'

import sys
print(getattr(sys.modules[\'__main__\'],\'name\'))     # 反射自己模块的变量
print(getattr(sys.modules[\'__main__\'],\'func\')())   # 反射自己模块的函数

 可能给其他模块调用就将\'__main__\'改为变量:__name__

# 可能给其他模块调用就将\'__main__\'改为变量:__name__
import sys
def name():return \'小龙女\'
ret=print(getattr(sys.modules[__name__],\'name\')())# 反射自己模块的函数

7、反射带参数、反射模块的类函数,getattr,hasattr:

# 7、反射带参数、反射模块的类函数
class A:
    @staticmethod
    def func(name,age):return name+age
print(getattr(A,\'func\')(\'广深小龙\',\'23\'))   # 反射带参数
import test
if hasattr(test,\'A\'):                        # 判断是否反射到其他模块类:A,返回bool
    res = getattr(test,\'A\')()                # 反射其他模块的类:A
    print(res.f())
else:print(\'没有反射到对象!\')

8、新增静态属性:setattr; 删除静态属性:delattr

# 8、新增静态属性:setattr
class A:pass
a = A()
setattr(a,\'name\',\'广深小龙\')
setattr(A,\'name\',\'小龙\')
print(a.name)
print(A.name)

# delattr 删除静态属性
delattr(a,\'name\')      # 删除实例化的a
print(a.name)           # 找的是类的name,因为原来的 广深小龙 被删除了

 欢迎来大家QQ交流群一起学习:482713805 !!!

以上是关于python-37-各种反射的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

OpenGL片段着色器不照亮场景

vbscript 各种自定义代码片段 - 有关详细信息,请参阅注释

小程序各种功能代码片段整理---持续更新

将 OpenGL 片段着色器设置为仅通过漫反射减少 vec4 色点的 RGB 值,而不是 alpha

反射机制