【Python编程】python对象的自省机制

news/2025/1/8 16:14:58/文章来源:https://www.cnblogs.com/o-O-oO/p/18657554

前言

Python的自省机制(Introspection)是指程序在运行时能够检查自身结构的能力。这意味着你可以获取关于对象的信息,如类定义、属性、方法等,并且可以在运行时动态地操作它们。Python提供了多种内置函数和属性来支持自省功能。
图片

基础示例

1. dir() 函数

dir() 是一个内置函数,它可以列出一个对象的所有属性和方法。

class MyClass:def __init__(self, value):self.value = valuedef my_method(self):pass
obj = MyClass(10)
print(dir(obj))  # 输出所有属性和方法,包括从object继承的

2. getattr() 和 setattr()

这两个函数分别用来获取和设置对象的属性值。

obj = MyClass(20)
print(getattr(obj, 'value'))  # 获取属性'value'
setattr(obj, 'value', 30)     # 设置属性'value'
print(obj.value)               # 输出: 30

3. hasattr() 函数

检查对象是否有指定的属性。

print(hasattr(obj, 'value'))  # 输出: True
print(hasattr(obj, 'nonexistent'))  # 输出: False

4. delattr() 函数

删除对象的属性。

delattr(obj, 'value')
print(hasattr(obj, 'value'))  # 输出: False

5. dict 属性

__dict__ 属性是一个字典,包含了类的所有属性。

print(obj.__dict__)  # 输出类的属性字典

6. doc 属性

__doc__ 属性包含类或方法的文档字符串。

print(MyClass.__doc__)  # 如果定义了文档字符串,则输出文档字符串

7. module 属性

__module__ 属性显示类定义所在的模块名称。

print(MyClass.__module__)  # 输出模块名,通常是文件名

8. bases 属性

__bases__ 属性显示类的基类。

print(MyClass.__bases__)  # 输出基类,通常是 (object,)

9. type() 函数

type() 函数可以返回一个对象的类型,也可以用来创建新的类实例。

print(type(obj))  # 输出:

10. inspect 模块

Python的inspect模块提供了更深入的自省工具,例如查看函数签名等。

import inspect
def example_function():"""This is an example function."""pass
print(inspect.signature(example_function))  # 输出函数签名
print(inspect.getdoc(example_function))  # 输出函数文档字符串

通过上述方法,你可以动态地了解对象的信息,这对于编写元编程(meta-programming)代码非常有用,尤其是在需要根据运行时条件改变程序行为的情况下。

高阶示例

动态添加方法到类

这个示例展示了如何在运行时动态地向类添加方法。

def dynamic_method(self):print(f"Hello from {self.name}")
class Person:def __init__(self, name):self.name = name
# 动态添加方法
setattr(Person, 'greet', dynamic_method)
# 使用Person类
p = Person("Alice")
p.greet()  # 输出: Hello from Alice

使用__slots__优化内存使用

__slots__是一个特殊的类属性,用于指定类实例可以拥有的属性。这可以减少内存消耗,并提高属性访问的速度。

class Employee:__slots__ = ('name', 'job_title', 'salary')def __init__(self, name, job_title, salary):self.name = nameself.job_title = job_titleself.salary = salary
# 使用Employee类
e = Employee("Bob", "Developer", 50000)
print(e.name)  # 输出: Bob
# 试图添加不在__slots__中的属性会抛出异常
try:e.age = 30
except AttributeError as e:print(e)  # 输出: 'Employee' object has no attribute 'age'

使用__getattr____setattr__重写属性访问

这些特殊方法允许你在访问或设置属性时执行自定义逻辑。

class LazyProperty:def __init__(self, func):self.func = funcdef __get__(self, instance, cls):if instance is None:return selfvalue = self.func(instance)setattr(instance, self.func.__name__, value)return value
class Circle:def __init__(self, radius):self.radius = radius@LazyPropertydef area(self):import mathreturn math.pi * self.radius ** 2
c = Circle(5)
print(c.area)  # 第一次计算并存储结果
print(c.area)  # 直接返回已存储的结果

使用__getattribute__拦截所有属性访问

__getattribute__方法允许你在每次属性被访问时进行拦截。

class LoggingObject:def __getattribute__(self, name):print(f"Accessing attribute: {name}")return super().__getattribute__(name)def __init__(self, value):self.value = value
obj = LoggingObject(42)
print(obj.value)  # 输出: Accessing attribute: value# 输出: 42

使用元类(Meta Class)

元类是创建类的类,可以用来定制类的行为。

class Meta(type):def __new__(cls, name, bases, attrs):attrs['class_name'] = name  # 添加一个属性return super().__new__(cls, name, bases, attrs)
class MyClass(metaclass=Meta):pass
# 使用MyClass类
mc = MyClass()
print(mc.class_name)  # 输出: MyClass

原创 huaan9527 测试开发学习交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/865330.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net6之阿里云OSS

概念 集成阿里云OSS文件存储服务 引用阿里云包封装AliyunSmsClient(二次封装阿里云短信基类)public class AliyunOssClient{private readonly AliyunOssOptions _options;private readonly OssClient _client;public AliyunOssClient(IOptions<AliyunOssOptions> options…

React数值滚动效果,支持数值变化变化

效果:组件:(NumberScroller.jsx)/*** 数字滚动效果*/ import React, { useEffect, useState } from react; import PropTypes from prop-types;const NumberScroller = ({ targetValue = 0, decimalPlaces = 0, duration = 2000 }) => {const [value, setValue] = useSt…

C#笔记(1、钉钉机器人推送帆软报表图片)

C#笔记——钉钉机器人推送帆软报表图片(一)1、前言 ​ 2024年最后一个月,家里多了个小公主,在家休息了一段时间。2025年,休完假上班第一天,领导就说:哎,我看总部那边做了个每日产出的报表推送到钉钉群,来看计划达成率。我们基地这边能不能做啊。我心里默默一想,然后大…

Javascript实现asp.net mvc的checkbox基本功能

Html的checkbox使用很广的,它的状态,勾选与非选。初始状态,默认为非选。你可以设置它是勾选, 直在checkbox 标签中,添加checked属性。另外,在javascript可以这样,getById(Checkbox_IsPublished).checked = true; 或者,getById(Checkbox_IsPublished).setAttribute(che…

“非旺玖原装的PL2303,请联系您的供应商”232串口转换器解决办法

偶尔会用到PL2303这种十几年前的旧芯片做的232串口转换器,如果手头没有别的工具必须使用的话,需要配置一下才能使用。该串口调试器在不同的USB口插入可能出现COM口无效或者端口号变动(COM 4/7/8等),需要通过设备管理器进行修改 当提示题目上的错误时,需要重装旧版本驱动1…

记录一个Github推送的问题(ssh推送出现:Connection closed by 198.18.0.9 port 22)

一、前言: 在公司需要将一个文档推送到GitHub仓库,由于Github对Https的推送已经移除了对密码认证的支持(2021.8.13),所以想要进行身份验证就只能使用两种方式:使用Persional Access Token(PAT) 使用SSH认证 PAT认证太麻烦了,每次都要输入,这里就主要介绍使用SSH认证的方…

安川机器人的独特优势

安川机器人,这一源自日本安川电机(Yaskawa Electric Corporation)的杰出产物,是工业自动化领域中的佼佼者,其核心价值在于生产线上那精准无误的自动化作业能力。这款机器人集成了电机、减速器、传感器、控制器等一系列精密部件,如同一套高效协同的作战系统,为企业带来了生…

2020-2024 IDEA安装+激活

一、下载 1. IDEA各版本官方下载入口 IDEA官网下载地址 2. 选择左边,然后点击【20xx.x.x-Windows(exe)】 PS: 如需下载特定版本,可以往下拉,都是选择【202x.x-Windows(exe)】下载二、安装 1. 点击运行 ps: 安全警告是部分电脑有,没有跳过就可以了~2. 点击下一步3. 选择安…

CDS标准视图:维护包描述 I_MaintPackageTextData

视图名称:维护包描述 I_MaintPackageTextData 视图类型:基础 视图代码:点击查看代码 @EndUserText.label: Maintenance Package - Text @ObjectModel.dataCategory: #TEXT @VDM.viewType: #COMPOSITE @AbapCatalog.sqlViewName: IMNTPCKGTXTDATA @AbapCatalog.compiler.comp…

CDS标准视图:维护包数据 I_MaintenancePackageData

视图名称:维护包数据 I_MaintenancePackageData 视图类型:基础 视图代码:点击查看代码 @AbapCatalog.sqlViewName: IMAINTPCKGDATA @AbapCatalog.compiler.compareFilter: true @AccessControl.authorizationCheck: #PRIVILEGED_ONLY @EndUserText.label: Maintenance Packa…

让跨 project 联查更轻松,SLS StoreView 查询和分析实践

在业务场景中,日志数据可能存储在日志服务 Project 的不同 Logstore/MetricStore 中或不同地域的 Project 中。日志服务的数据集(StoreView)功能支持跨地域、跨 Store 联合查询和分析,让用户基于数据集就能高效便捷地查询分析全地域的数据,真正做到数据分析不受地域边界的…

流程配置中心同步后流程版本ID不一致

不同的账套进行流程发布时会产生不同的版本ID , BOS同步后的流程设计的ID是相同的.