首页 > 编程语言 >探索Python的反射与内省:代码的自我察觉

探索Python的反射与内省:代码的自我察觉

时间:2023-06-22 10:32:21浏览次数:51  
标签:__ Python self 内省 instance 察觉 print my method

Python中的反射与内省允许代码察觉和修改它自己。反射指的是程序在运行时可以访问、检测和修改它自己的结构或行为的一种能力。而内省则更侧重于查看对象的类型和属性,比如查看一个对象是否有某个属性或方法,以及查看对象的文档字符串等。本文将深入探讨Python的反射与内省能力。

探索Python的反射与内省:代码的自我察觉_属性值

一、基础的反射函数

Python提供了许多内置函数来支持反射。比如type,id,getattr,setattr和hasattr等。


class MyClass:

    def __init__(self):

        self.my_attribute = 123

        self.another_attribute = "Hello"

        

    def my_method(self):

        pass


instance = MyClass()


# 使用type检测对象类型

print(type(instance))  # 输出: <class '__main__.MyClass'>


# 使用id获取对象内存地址

print(id(instance))  


# 使用getattr获取属性值

print(getattr(instance, 'my_attribute'))  # 输出: 123


# 使用setattr修改属性值

setattr(instance, 'my_attribute', 456)

print(getattr(instance, 'my_attribute'))  # 输出: 456


# 使用hasattr检测是否有某个属性

print(hasattr(instance, 'nonexistent_attribute'))  # 输出: False

二、dir函数和__dir__方法

dir函数和__dir__方法可以用来获取一个对象的所有属性和方法。


class MyClass:

    def __init__(self):

        self.my_attribute = 123


    def my_method(self):

        pass


instance = MyClass()

print(dir(instance))

输出将包含my_attribute和my_method,以及一些由Python自动添加的魔法方法。


三、反射在动态操作中的应用

反射在需要进行动态操作时非常有用,比如我们可以基于字符串的名字来调用方法:


class MyClass:

    def my_method(self):

        return "Hello, world!"


instance = MyClass()

method_name = 'my_method'

method = getattr(instance, method_name)

print(method())  # 输出: Hello, world!

四、内省的一些有用工具

Python标准库提供了一些用于内省的有用工具,比如inspect模块:


import inspect


class MyClass:

    def my_method(self):

        return "Hello, world!"


print(inspect.getmembers(MyClass))  



getmembers函数返回一个包含所有成员的列表。


五、总结

Python的反射和内省机制提供了强大的工具,使得我们的代码可以在运行时查看和修改自身。

标签:__,Python,self,内省,instance,察觉,print,my,method
From: https://blog.51cto.com/u_16120785/6534329

相关文章

  • Python time 模块简述
    time简介time是Python处理时间的标准库,其提供了三种时间表达形式时间戳结构化时间对象格式化时间字符串时间戳获取当前时间戳,计算内部时间,以浮点数形式返回importtimeprint(time.time())#1685243267.1221318结构化时间对象time.gmtime()将纪元以来以秒为为......
  • python写的一个脚本,在电脑运行。可以实现 手机端在线通过url观看电视
    python脚本,需要安装pipinstallflashpipinstallflash_restful fromflaskimportFlask,send_from_directoryfromflask_restfulimportApi,Resourceapp=Flask(__name__)api=Api(app)classTVSeriesResource(Resource):defget(self,episode):......
  • 【python基础】类
    类是Python重要的知识点,现将学习目录整理如下:1.类-初识类2.类-类属性3.类-继承4.类-模块......
  • 【python基础】类-模块
    随着不断给类添加功能,文件可能变得很长,即便妥善地使用了继承亦是如此,为遵循Python的总体理念,应让文件尽可能简洁。为在这方面提供帮助,Python允许将类存储在模块中,然后在主程序中导入所需的模块。1.导入单个类新建一个Animal类的模块,其中只包含Animal类,编写程序如下所示:在主程......
  • python3在mac下配置
    目的https://github.com/VonSdite/Plane_Wars可以本地跑起来。下载并安装python3https://www.python.org/downloads/mac-osx/下载安装好后命令行是要用python3,而不是python,python是系统自带的python2。$python3Python3.7.4(v3.7.4:e09359112e,Jul82019,14:54:52)......
  • Python - 生成指定大小的文件
    项目测试过程中需要上传不同大小的文件,一时难以找到这么多测试数据,网上查了下,可以使用Python来快速生成,方法如下方法1:使用特定大小的文本重复生成,指定一个文本字符串text,然后将其重复复制直至达到所需的文件大小。defgenerate_file(file_path,file_size_bytes):text=......
  • 十六、python里的函数
    十六、python里的函数python里函数分为内置函数与自定义函数内置函数:如int(),str(),len()等,所有的内置函数参考https://docs.python.org/3/library/functions.html自定义函数的定义与调用(重点)deffunct():#函数名(),括号里可以写参数,也可以不写"""函数说......
  • Python遍历dict类型数据,输出预期结果
    主要代码段: dict数据(预期结果对应的数据如下)1、 2、 输出预期结果:1、[(值1,值2),(值3,值4)] 2、[(值1,值2)](两种情况不会同时出现) ......
  • Day 01 python基础
    某个字的编码print(ord('北'))#北这个字的编码(数字)21271多条print()输出到一行显示,只需要将end设置成其他字符,比如end=‘(中间放内容)’使用连接符连接多个字符串,使用“+”连接数值和其他数据类型时,系统默认为加法计算,程序报错,解决方案,可将数值作为字符串来处理可以......
  • python基础之编码和加密
    一、base64importbase64#编码s1='hello'result=base64.b64encode(s1.encode())#只能对bytes类型编码,结果为bytes类型print(result.decode())#解码为字符串#解码res="6IuR5rWpIGlzIGdvb2Q="s2=base64.b64decode(res.encode())#只能对bytes类型解码,结......