反射 | Python

Posted 胡说八道

tags:

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

# 使用反射获取到的函数和方法可以像平常一样加上括号直接调用,获取到类后可以直接构造实例;
# 不过获取到的字段不能直接赋值,因为拿到的其实是另一个指向同一个地方的引用,赋值只能改变当
# 前的这个引用而已。
# 一.访问对象的属性
class Person():
    def __init__(self):
        self.name = Mic
        self.age = 18

    def run():
        print(run----)

obj = Person()
print(dir(obj))
if hasattr(obj, name):
    setattr(obj, name, Merry)
print(getattr(obj, name))

# 1.dir(obj) 返回包含obj大多数属性名的列表
# 2.hasattr(obj, attr) 判断对象是否含有指定属性
# 3.getattr(obj, attr) 获取对象指定属性的值
# 4.setattr(obj, attr, value) 设置对象指定属性的值

# 二.访问对象的元数据
# dir()方法返回的属性中包含一些不是自己定义的元数据;
# types模块定义了全部python内置类型;
# isinstance()函数也可以检查对象是否指定的数据类型;

# 1.反射模块的元数据
import re
print(re.__doc__) # 文档字符串
print(re.__name__) # 字符串形式的模块名
print(re.__file__)
# print(re.__dict__) # 将对象的属性名及属性,以字典的形式返回;
# 在python3中,字典的items()方法返回的是一个内置__iter__()方法的类,
# 所以,就是一个可迭代对象,可以for循环遍历,但是不能通过下标来取;
# 在python2中,字典的items()方法返回的是[(,), (,), (,)]类型数据;

# 2.反射类的元数据
print(Person.__doc__) # 文档字符串
print(Person.__name__) # 定义时的类名
print(Person.__module__) # 字符串形式的模块名
print(Person.__bases__) # 第一层父类的元组
print(Person.__dict__) # 属性名-属性字典

# 3.反射实例的元数据
print(obj.__dict__) # 属性名-属性字典
print(obj.__class__) # 该实例的类对象
print(obj.__class__==Person) # True

# 4.反射内建函数和方法的元数据
# python的内建函数是c写的模块,可以sys模块的builtin_module_names字段
# 查看所有内建模块
print(max.__doc__.splitlines()[0]) # 函数文档
print(max.__name__) # 函数定义时的名字
print(max.__self__) # 指向该方法的类 
print(max.__module__) # 函数所在模块名

# ...略
# inspect模块提供了一系列函数帮助反射查询;

 



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

OpenGL片段着色器不照亮场景

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

反射机制

反射机制入门

反射机制入门

反射机制入门