首页 > 编程语言 >Python的反射

Python的反射

时间:2024-02-26 22:35:58浏览次数:26  
标签:__ 反射 name Python self person age 属性

1、什么是反射

反射是指在运行时检查、访问和修改对象的属性和方法。通过反射,可以动态地获取对象的信息并执行相应的操作,而不需要提前知道对象的具体结构。

2、使用内置函数和来实现反射操作

  1. getattr(object, name[, default]):

    • 用于获取对象的属性值。
    • 参数 object 是要操作的对象。
    • 参数 name 是属性名。
    • 可选的参数 default 在属性不存在时返回默认值。
  2. setattr(object, name, value):

    • 用于设置对象的属性值。
    • 参数 object 是要操作的对象。
    • 参数 name 是属性名。
    • 参数 value 是要设置的属性值。
  3. hasattr(object, name):

    • 用于检查对象是否具有指定的属性。
    • 参数 object 是要操作的对象。
    • 参数 name 是属性名。
  4. delattr(object, name):

    • 用于删除对象的属性。
    • 参数 object 是要操作的对象。
    • 参数 name 是属性名。

3、使用特殊方法来实现反射

  1. __getattr__(self, name):

    • 当访问对象的属性不存在时被调用。
    • 可以在该方法中定义处理不存在属性的行为。
  2. __setattr__(self, name, value):

    • 当给对象的属性赋值时被调用。
    • 可以在该方法中定义属性赋值的行为。
  3. __delattr__(self, name):

    • 当删除对象的属性时被调用。
    • 可以在该方法中定义属性删除的行为。

4、反射的优点

它可以在运行时根据需要操作对象的属性,使代码更加灵活和动态。它常用于以下情况:

  • 动态地访问和调用对象的属性和方法,特别适用于处理未知的对象类型或具有动态属性的对象。
  • 实现通用的代码,可以适用于不同类型的对象。
  • 在测试和调试过程中,探索对象的结构和行为。

需要注意的是,反射操作可能会增加代码的复杂性和运行时开销。在使用反射时,应当小心处理异常情况,确保属性存在或采取适当的处理方式,以避免潜在的错误。

5、内置方法实现反射的案例

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Person:     def __init__(self, name, age):         self.name = name         self.age = age       def greet(self):         print(f"Hello, my name is {self.name}.")   # 创建一个 Person 对象 person = Person("Alice"25)   # 使用 getattr 获取属性值 name = getattr(person, "name") print(f"Name: {name}")  # Name: Alice   # 使用 setattr 设置属性值 setattr(person, "age"30) print(f"Updated age: {person.age}"# Updated age: 30   # 使用 hasattr 检查属性是否存在 has_hobbies = hasattr(person, "hobbies") print(f"Has hobbies? {has_hobbies}")  # Has hobbies? False   # 使用 getattr 调用方法 greet_method = getattr(person, "greet") greet_method()  # 输出: Hello, my name is Alice.

6、特殊方法实现反射的案例

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 class Person:     def __init__(self, name, age):         self.name = name         self.age = age           def __getattr__(self, name):         if name == "hobbies":             raise AttributeError("Attribute 'hobbies' not found")           def __setattr__(self, name, value):         if name == "age":             self.__dict__[name] = value         else:             raise AttributeError("Cannot set attribute")       def __delattr__(self, name):         if name == "age":             del self.__dict__[name]         else:             raise AttributeError("Cannot delete attribute")           def __call__(self):         print(f"Hello, my name is {self.name}.")   # 创建一个 Person 对象 person = Person("Alice"25)   # 使用 getattr 获取属性值 name = person.__getattr__("name") print(f"Name: {name}")   # 使用 setattr 设置属性值 person.__setattr__("age"30) print(f"Updated age: {person.age}")   # 使用 hasattr 检查属性是否存在 has_hobbies = hasattr(person, "hobbies") print(f"Has hobbies? {has_hobbies}")   # 使用 __call__ 调用方法 person.__call__()  # 输出: Hello, my name is Alice.

标签:__,反射,name,Python,self,person,age,属性
From: https://www.cnblogs.com/Jessica-Jmm/p/18035734

相关文章

  • Python的魔术方法
    一、什么是魔术方法1、魔术方法是一组具有特殊命名和行为的特殊方法,它们允许您自定义类的行为。这些方法使用双下划线(__)作为前缀和后缀,因此也被称为双下划线方法或特殊方法。2、需要掌握每个方法什么时候触发或者执行二、常见的魔术方法1、__init__方法初始化方法,当一个类被......
  • 【MMD x EEVEE教程】EEVEE中隐藏材质,保留反射和阴影
    要用到光程节点中的是相机射线,一个非0即1的值,相机直接看到的为1,通过其它物体间接看到的为0,比如反射折射,漫射。如果要隐藏材质本身,在光滑地面中保留反射和阴影,下面为节点,材质混合模式需要设置为alphahashed。 如果要隐藏材质,保留阴影,但屏蔽掉地面反射中的物体,可以 ......
  • python 发送grafana dashboard 面板内容截图到飞书群
    需求每天定时发送grafanadashboard截图至飞书群,每天获取前一天的算力服务器使用率趋势图环境docker环境#搭建docker环境、配置grafana#catdocker-compose.yamlversion:'3.5'services:grafana:image:grafana/grafana:latestrestart:alwaysports:-......
  • 可编辑模式下安装 python 包
    可编辑模式下安装python包一般情况下,我们使用的是pipinstallpkg来完成包的安装,默认的安装的目标目录在site-packages下,这种情况非常适合我们引用某些成熟包.如果我们想要给github某个项目贡献PR,或者仅仅要魔改一下某个项目,可以使用editable模式来安装.edit......
  • Python flask
    {{变量}}_init_.py这个文件的执行时间package,moduledebug模式、host、portdebug模式:热更新可以在浏览器上面显示错误信息host让别人可以访问自己的电脑url与试图映射urlRESTful风格传参@app.route('/user/<user_id>')#可以指定参数的类......
  • Python pip换源
    Pythonpip更换镜像源在使用Python的过程中,经常会使用到一些非标准内嵌的三方包,这些包给我们日常的开发提供了巨大的便利。但是在使用pip命令去下载这些三方包的时候,Python默认是从官网去下载的,由于它的官网是在国外,这就使得下载的速度灰常的慢;这个时候我们可以使用一些国内......
  • Python|statistics 数学统计函数模块
    方法描述statistics.harmonic_mean()计算给定数据集的调和平均值。是总体内各个变量值倒数1/x的算术平均数的倒数。statistics.mean()计算数据集的平均值statistics.median()计算数据集的中位数statistics.median_grouped()计算给定分组数据集的分组中位数......
  • GEE哨兵-2光学卫星(S2)地表反射率和NDVI下载
    GEE下载sentinel-2(S2)哨兵2光学卫星的地表反射率和NDVI可以获得数据的时期为:2017-03-28至今2024年数据已经去云,进行合成,分年度的夏季和冬季提供。下载方法:todesk:1.程序名称:S2_SR哨兵2地表反射率和NDVI下载2.下载参数:年份设置3绘制下载区域,可以为多边形或者矩形,4.一定改名......
  • GEE哨兵-2光学卫星(S2)地表反射率和NDVI下载
    GEE哨兵-2光学卫星(S2)地表反射率和NDVI下载可以获得数据的时期为:2017-03-28至今下载方法:todesk:1.程序名称:S2_SR哨兵2地表反射率和NDVI下载2.下载参数:年份设置3绘制下载区域,可以为多边形或者矩形,4.一定改名为handRegion5可以选的,通过名称,可以加载市,县的行政区划底图,以辅......
  • Python使用shutil模块操作文件/文件夹
    Python的标准库中os模块已经可以操作文件了,但是具有很多局限性(比如不能复制文件),因此Python的另一个标准库shutil对文件/文件夹的移动,复制,删除文件夹,压缩,解压等操作做了增强,更加方便用户进行使用。 1、复制文件/文件夹(shutil.copy(src,dst))1.1复制文件复制文件常......