码迷,mamicode.com
首页 > 编程语言 > 详细

反射 | Python

时间:2017-12-26 22:00:41      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:pes   asa   doc   建模   style   run   import   nbsp   ase   

# 使用反射获取到的函数和方法可以像平常一样加上括号直接调用,获取到类后可以直接构造实例;
# 不过获取到的字段不能直接赋值,因为拿到的其实是另一个指向同一个地方的引用,赋值只能改变当
# 前的这个引用而已。
# 一.访问对象的属性
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

标签:pes   asa   doc   建模   style   run   import   nbsp   ase   

原文地址:https://www.cnblogs.com/pymkl/p/8120051.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!