Python 面向对象之反射

Python 面向对象之反射

【一】概念

  • 反射是指通过对象的属性名或者方法名获取对象的属性或调用方法的能力
  • 反射还指的是在程序额运行过程中可以动态获取对象的信息(属性和方法)

【二】四个内置函数

  • 又叫做反射函数

  • 万物皆对象(整数、字符串、函数、模块、类等等)

  • 万物皆对象(整数、字符串、函数、模块、类等等)

  • 万物皆对象(整数、字符串、函数、模块、类等等)

  • 这里提到的对象都是大概念的对象

【1】hassttr

(1)概念
  • hasattr(object, str)

  • 判断对象是否有相应属性或者方法

  • 第一个参数是对象,第二个参数属性或者方法的字符串

  • 返回值为bool值,有则True,无则False

  • 注意:类无法找到实例属性

(2)代码
class A:name = "bruce"def __init__(self):self.age = 18def eat(self):print(f"{self.name}eating")# 查看类是否具有相应属性和方法
print(hasattr(A, "name"))  # True
print(hasattr(A, "age"))  # False
print(hasattr(A, "eat"))  # True# 查看对象是否具有相应属性和方法
a = A()
print(hasattr(a, "name"))  # True
print(hasattr(a, "age"))  # True
print(hasattr(a, "eat"))  # True

【3】getattr

(1)概念
  • hasattr(object, name[, default])

  • 获取对象的属性或者方法

  • 第一个参数是对象,第二个参数属性或者方法的字符串,第三个参数是找不到返回的默认值

  • 返回值为属性或者方法或默认值,找不到也没有默认值会报错

(2)代码
class A:name = "bruce"def __init__(self):self.age = 18def eat(self):print(f"{self.name} is eating")a = A()
print(getattr(a, "name"))  # bruce
print(getattr(a, "age"))  # bruce
res = getattr(a, "eat")  # # <bound method A.eat of <__main__.A object at 0x000>>
res()  # bruce is eating
# getattr(a, "nname") # 报错
print(getattr(a, "nname", "找不到"))  # 找不到

【3】setattr

(1)概念
  • setattr(object, str)

  • 设置对象的属性或者方法

  • 第一个参数是对象,第二个参数是属性的字符串或者方法地址

  • 已有就修改,没有就添加

  • 注意:给实例添加的方法是属性

(2)代码
class A:name = "bruce"def __init__(self):self.age = 18def eat(self):print(f"{self.name} is eating")a = A()
setattr(a, "name", "lily")
print(getattr(a, "name"))  # lily
setattr(a, "age", 20)
print(getattr(a, "age"))  # 20def func(self):print("类外的函数1")
# 给实例添加的一个属性,他是方法
setattr(a, "func", func)
print(a.__dict__)  # {'age': 20, 'name': 'lily', 'func': <function func at 0x000>}
a.func(a)  # 类外的函数1def func(self):print("类外的函数2")
# 给类添加了一个方法
setattr(A, "func", func)
A.func(a)  # 类外的函数2
a.func(a)  # 类外的函数1

【4】delattr

(1)概念
  • delattr(object, str)

  • 删除对象的属性或者方法

  • 第一个参数是对象,第二个参数是属性或者方法的字符串

  • 没有返回值,删除没有的会报错

  • 注意通过实例无法删除类属性或者方法

(2)代码
class A:name = "bruce"def __init__(self):self.age = 18def eat(self):print(f"{self.name} is eating")# 对属性操作
a = A()
# delattr(a, "name") # 无法删除
delattr(a, "age")
print(getattr(a, "age", "找不到"))  # 找不到
delattr(A, "name")
print(getattr(A, "name", "找不到"))  # 找不到# 对方法操作
a = A()
# delattr(a, "eat") # 无法删除
print(getattr(A, "eat", "找不到"))  # 找不到

【三】应用

【1】反射当前模块成员

  • 用于查看当前模块下的
import sysclass A:pass
class B(A):pass
def func():passmodule_member = sys.modules[__name__]
print(module_member)
# <module '__main__' from 'D:\\Python\\PythonProjects\\My_projects\\tets_tempory\\main.py'>
print(hasattr(module_member, "B"))  # True
print(hasattr(module_member, "func"))  # True

【2】动态导入模块

  • 通过importlib模块导入所需要的模块,通过ImportError异常判断模块是否能导入
  • 通过getattr反射获取模块的方法,通过AttributeError异常判断该模块是否具有这个方法
import importlibmodule_name = input("module name:>>>")
method_name = input("method name:>>>")
try:module = importlib.import_module(module_name)method = getattr(module, method_name)method()
except ImportError:print("module not found")
except AttributeError:print("method not found")

【3】动态创建对象

class FirePeaShooter:def introduce(self):print("I`m FirePeaShooter")class IcePeaShooter:def introduce(self):print("T`m IcePeaShooter")type = input("input type (fire or ice):>>>")
global_class = globals()if "fire" in type:class_type = "FirePeaShooter"obj = global_class[class_type]()obj.introduce()
elif "ice" in type:class_type = "IcePeaShooter"obj = global_class[class_type]()obj.introduce()
else:print("wrong")

【四】总结

请添加图片描述

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

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

相关文章

Unity中Shader序列帧动画(总结篇)

文章目录 前言一、半透明混合自定义调整1、属性面板2、SubShader中3、在片元着色器(可选)3、根据纹理情况自己调节 二、适配Build In Render Pipeline三、最终代码 前言 在前几篇文章中&#xff0c;我们依次解决了实现Shader序列帧动画所遇到的问题。 Unity中Shader序列图动画…

欧系数学一眼假系列7.“欧拉常数”是弥天大谎

数学界一直在干一件令人恶心的丑事&#xff1a;明明我求的是Σ1/708249541360742487&#xff0c;它给的答案却是ln7082495413607424870.5772156649(欧拉常数&#xff0c;通常以C表示)&#xff0c;门外汉皆以为Σ1/n→∞是正经结论&#xff0c;全然不知它无关Σ1/n&#xff0c;而…

Geoserver扩展发布MySQL视图功能

Geoserver中并不自带mysql数据发布功能&#xff0c;需要扩展外部插件。 1、示例以geoserver-2.20.5版本进行演示&#xff0c;所以MySQL插件需要到该版本对应的“Extensions”标题下查找&#xff0c;下载地址&#xff1a;GeoServer&#xff0c;详见下图 2、选择MySQL进入下载页…

解决:TypeError: ‘tuple’ object does not support item assignment

解决&#xff1a;TypeError: ‘tuple’ object does not support item assignment 文章目录 解决&#xff1a;TypeError: tuple object does not support item assignment背景报错问题报错翻译报错位置代码报错原因解决方法方法一&#xff1a;方法二&#xff1a;今天的分享就到…

【KD】知识蒸馏(knowledge distillation)简单介绍

最近学到了知识蒸馏的相关知识&#xff0c;来简单总结一下૮꒰ ˶• ༝ •˶꒱ა。 知识蒸馏 知识蒸馏&#xff0c;是一种模型压缩的手段。通过训练学生模仿教师的行为&#xff0c;将嵌入在大的教师模型中的知识迁移到小的学生模型。 例如&#xff0c;TinyBERT(Jiao et al.,2…

stm32学习笔记:TIM-输出比较

四部分讲解内容&#xff0c;本文是第二部分 输出比较主要用于PWM波形的控制电机&#xff08;驱动电机的必要条件&#xff09; 1、定时器基本定时&#xff0c;定一个时间&#xff0c;然后让定时器每隔一段时间产生一个中断&#xff0c;来实现每隔一个固定时间执行一段程序的目…

【C语言】Linux实现高并发处理的过程

一、实现高并发的几种策略 C语言本身并没有内建的多线程支持&#xff08;新版C语言支持&#xff0c;但用得不多&#xff09;&#xff0c;但是在多数操作系统中&#xff0c;可以使用库来实现多线程编程。例如&#xff0c;在POSIX兼容系统上&#xff0c;可以使用 pthreads 库来创…

海外分支访问国内服务器系统慢怎么办?

在全球业务不断扩张的今天&#xff0c;企业面临着海外分支访问国内总部服务器系统慢的问题。为了解决这一挑战&#xff0c;我们引入了lxway全球系统专网产品&#xff0c;为企业提供高效、安全的全球网络连接方案。通过解析技术瓶颈和专网的优势&#xff0c;本文将揭示如何借助先…

大事务提交优化

经常性的报死锁异常&#xff0c;经常性的主从延迟......通过报错信息按图索骥&#xff0c;发现代码是这样的。 这是一段商品发布的逻辑&#xff0c;我们可以看到参数校验、查询、最终的insert以及update全部揉在一个事务中。遇到批量发布商品的时候就经常出现问题了&#xff0c…

日志高亮 | notepad

高亮显示日志 日志文件无法清晰看到关键问题所在? 看到一堆日志头疼?高亮日志可以清晰展示出日志的 ERROR级等各种等级的问题, 一下浏览出日志关键所在 tailspin 项目地址&#xff1a; https://githubfast.com/bensadeh/tailspin 使用Rust包管理器cargo安装 安装 - Cargo 手…

软件测试|深入学习 Docker Logs

简介 Docker 是一种流行的容器化技术&#xff0c;它能够帮助用户将应用程序及其依赖项打包成一个可移植的容器。Docker logs 是 Docker 提供的用于管理容器日志的命令&#xff0c;本文将深入学习 Docker logs 的使用和管理&#xff0c;帮助用户更好地监测和解决容器问题。 Do…

box-shadow参数学习及渲染过程研究

参数定义 CSS 的 box-shadow 属性用于在元素的框架周围添加阴影效果。它可以接受多个由逗号分隔的阴影效果&#xff0c;每个阴影效果由以下几部分组成&#xff1a; h-offset&#xff1a;水平阴影的位置。正值将阴影向右移动&#xff0c;负值将阴影向左移动。v-offset&#xf…