关于python3.x:探索Python的反射与内省代码的自我察觉

46次阅读

共计 1296 个字符,预计需要花费 4 分钟才能阅读完成。

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

一、根底的反射函数

Python 提供了许多内置函数来反对反射。比方 typeidgetattrsetattrhasattr等。

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_attributemy_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 的反射和内省机制提供了弱小的工具,使得咱们的代码能够在运行时查看和批改本身。

正文完
 0