首页 > 编程语言 >【Python编程】python对象的自省机制

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

时间:2025-01-07 14:34:11浏览次数:1  
标签:__ name Python self value python print 自省 属性

前言

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

基础示例

1. dir() 函数

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

class MyClass:
    def __init__(self, value):
        self.value = value
    def 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 = name
        self.job_title = job_title
        self.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 = func
    def __get__(self, instance, cls):
        if instance is None:
            return self
        value = self.func(instance)
        setattr(instance, self.func.__name__, value)
        return value
class Circle:
    def __init__(self, radius):
        self.radius = radius
    @LazyProperty
    def area(self):
        import math
        return 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 测试开发学习交流

标签:__,name,Python,self,value,python,print,自省,属性
From: https://www.cnblogs.com/o-O-oO/p/18657554

相关文章

  • Python 中的三种字符串格式化方式:% 格式化字符、str.format方法、f-string函数
    Python中的三种字符串格式化方式:%格式化字符、str.format方法、f-string函数Python中的三种字符串格式化方式:%格式化字符、str.format()方法和f-string(f函数)1.格式化字符(%格式化)1.1优缺点,使用场景1.2%格式化字符详细说明1.3什么是宽度?1.4格式化字符语法1.......
  • 新一代python版本与依赖管理工具 uv
    uvpython版本与依赖管理选择原因1.新的好玩、rust开发的执行速度快2.确实方便3.轻,软件就十几二十兆,占磁盘小4.uv.lock可以锁版本场景应用场景一从anaconda、conda、pipenv等迁移过来导出依赖列表pipfreeze>requirements.txt#调整绝对路径的模块进入......
  • [Python爬虫] 抓取京东商品详情数据||京东商品列表接口采集
    一、引言在电商数据分析和市场调研领域,获取京东平台的商品数据至关重要。通过抓取京东商品详情数据以及利用商品列表接口采集数据,可以深入了解商品的各项信息,包括价格、销量、用户评价等,从而为电商从业者、市场分析师和数据爱好者提供有价值的决策依据。本教程将详细介绍如何......
  • python协程是否可以解决python多进程队列等待的时间消耗
    相关:强化学习:手动实现一个并行环境采样的代码——SynVectorEnv之前写了一个python环境下的多进程仿真环境采样的代码库,后来突发奇想,想到是否可以使用python的协程来解决python多进程同步通信的等待时间消耗,后来写了个Demo的代码,发现没有啥用,准确来说确实有提高,性能提高的又1......
  • Python语言中进程、线程、协程执行效率分析
    python语言中进程、线程、协程执行效率比较。问题:python语言中进程、线程、协程执行速度哪个最快?在Python中,进程、线程和协程的执行速度不能简单地进行比较,因为它们的性能取决于多种因素,包括任务类型、I/O操作、CPU密集型计算、操作系统调度策略以及Python解释器的实现。进......
  • Ray 源码分析系列(12)—python/ray._private
    前言这个文件夹下放置了python最核心的代码,从文件夹命名就可以知道,这部分的代码并不是用户可修改的部分,而是ray进行任务管理、节点交互、GCS通信等核心功能实现。核心实现概览文件名/模块名功能描述services.py负责Ray的核心服务管理,包括启动和停止Ray的......
  • 移远EC800M-CN的python代码使用
    本文档目的介绍EC800M模组使用python脚本控制的过程1.烧写QPython的模组固件,移远已经提供。资源下载|QuecPython,下载相应固件。2.安装模组的USB驱动,然后USB连接电脑,打开Qpycom,选择串口,下载-》选择固件-》下载固件3.下载完成后,模组会重启。4.在Qpycom中,重新选择串口,......
  • 5个代码技巧,加速你的Python!
    Python作为一种功能强大的编程语言,因其简单易学而受到很多初学者的青睐。它的应用领域又非常广泛:科学计算、游戏开发、爬虫、人工智能、自动化办公、Web应用开发等等。而在数据科学领域中,Python是使用最广泛的编程语言,并且其受欢迎程度持续增长。如果也经常需要用Python处理......
  • 【PSO-LSTM】基于PSO优化LSTM网络的电力负荷预测(Python代码实现)
    ......
  • PYTHON与JAVA执行时间对比
    PYTHON与JAVA执行时间对比PYTHONJAVA结论PYTHONimporttimestart_time=time.time()n=int(input())jie=1sum=0i=1whilen>=i:jie=jie*isum=sum+jiei=i+1print(sum)end_time=time.time()print("程序执行时间为......