心蓝的博客 心蓝的博客
首页
  • 零基础

    • python零基础入门
  • 专项

    • 正则表达式
  • web框架

    • django框架
    • drf
技术
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档

心蓝

人生苦短,我用python
首页
  • 零基础

    • python零基础入门
  • 专项

    • 正则表达式
  • web框架

    • django框架
    • drf
技术
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
  • 编程基础

  • python开发环境搭建

  • 基本数据类型

  • 程序流程控制

  • 函数与代码复用

  • 面向对象

    • 类和对象
    • 属性
    • 方法
    • 继承
    • super函数
    • 多态
    • 私有化
    • 自省与反射机制
      • 自省
      • 反射
  • 模块和包

  • 文件IO操作

  • python零基础入门
  • 面向对象
心蓝
2022-12-23
目录

自省与反射机制

# 自省与反射机制

# 自省

在日常生活中,自省(introspection)是一种自我检查行为。

在计算机编程中,自省是指这种能力:检查对象以确定它是什么类型、它有哪些属性和哪些方法。自省向程序员提供了极大的灵活性和控制力。

python中的自省函数有很多,凡是可以检查对象状态的函数都可以称为自省函数,常用的自省函数如下:

  • type

type函数可以返回一个对象的类型

>>> type(1)
int
1
2
  • isinstance

检查一个对象是否是某个或某些类型的实例

>>> isinstance(1, int)
True
1
2
  • issubclass

检查一个类是否是某个或某些类的子类

>>> issubclass(bool, int)
True
1
2
  • dir

返回一个传入对象的属性名和方法名的字符串列表

>>> print(dir(1))
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
1
2

# 反射

反射就是动态的操作对象。

简单的讲就是根据字符串形式的属性名方法名操作对应的对象。

python中的反射函数如下:

  • hasattr

检查一个对象是否有给定名称的属性

>>> hasattr([1,2,3], 'append')
True
1
2
  • getattr

返回一个对象给定名称的属性

getattr(x,'y')等价于 x.y

>>> class Point:
...     name = '点'
>>> getattr(Point,'name')
'点'
1
2
3
4
  • setattr

给一个对象添加一个给定名称的属性

setattr(x, 'y', v) 等价于 x.y = v

>>> setattr(Point,'x',1)
>>> Point.x
1
1
2
3
  • delattr

删除对象的一个给定名称的属性

delattr(x, 'y') 等价于del x.y

>>> delattr(Point, 'x')
>>> Point.x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Point' has no attribute 'x'
1
2
3
4
5

自省和反射机制的灵活运行需要大量的练习和阅读源码。

本文完,感谢你的耐心阅读,如有需要可加我微信,备注「博客」并说明原因,我们一起进步,下次见。

上次更新: 2023/04/16, 21:41:27
私有化
模块

← 私有化 模块→

最近更新
01
requests让接口测试如此简单 原创
03-31
02
最简明的python正则教程
03-30
03
pycharm激活码
12-30
更多文章>
Theme by Vdoing | Copyright © 2019-2025 心蓝
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式