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")
【四】总结
相关文章:

Python 面向对象之反射
Python 面向对象之反射 【一】概念 反射是指通过对象的属性名或者方法名来获取对象的属性或调用方法的能力反射还指的是在程序额运行过程中可以动态获取对象的信息(属性和方法) 【二】四个内置函数 又叫做反射函数 万物皆对象(整数、字符串、函数、模块、类等等…...

HPM6750开发笔记《DMA接收和发送数据UART例程深度解析》
目录 概述: 端口设置: 代码分析: 运行现象: 概述: DMA(Direct Memory Access)是一种计算机系统中的数据传输技术,它允许数据在不经过中央处理器(CPU)的直…...
SQL IN 操作符
IN 操作符 IN 操作符允许您在 WHERE 子句中规定多个值。 SQL IN 语法 SELECT column1, column2, ... FROM table_name WHERE column IN (value1, value2, ...); 参数说明: column1, column2, ...:要选择的字段名称,可以为多个字段。如果…...

如何使用Plex在Windows系统搭建个人媒体站点公网可访问
文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各…...

web前端——clear可以清除浮动产生的影响
clear可以解决高度塌陷的问题,产生的副作用要小 未使用clear之前 <!DOCTYPE html> <head><meta charset"UTF-8"><title>高度塌陷相关学习</title><style>div{font-size:50px;}.box1{width:200px;height:200px;backg…...

centos用yum安装mysql详细教程
1 查询安装mysql的yum源,命令如下 ls /etc/yum.repos.d/ -l 界面如下图所示,未显示mysql的安装源 2 安装mysql相关的yum源,例如: 例如:rpm -ivh mysql57-community-release-el7.rpm 要注意 mysql的版本和系统的版本匹配 mysql57-communi…...

冲刺2024年AMC8竞赛的专题突破:匹克定律和不规则形状面积的求法
先温馨提示:2024年AMC8比赛报名今天是最后一天,如果还想参加比赛的孩子今天务必完成报名,错过今天再等一年。需要AMC8自由报名通道可以问我。 到昨天为止,六分成长已经把过去20多年的AMC8竞赛真题都给大家过了一遍,今天为大家做一…...

阿里云迁移AWS视频点播技术攻坚
文章目录 🐷 背景🦥 简述🐥 Aws服务🦜 AWS CloudFormation🐞 问题🐉 落地方案🦉 Aws vs Aliyun🍄 避坑指南 🐷 背景 由于AWS整体成本略低于阿里云,公司决定将…...
Scrum敏捷认证CSM官方认证班Certified ScrumMaster - CSM认证班
课程简介 Scrum是目前运用最为广泛的敏捷开发方法,是一个轻量级的项目管理和产品研发管理框架,旨在最短时间内交付最大价值。根据2021年全球敏捷状态报告,Scrum及Scrum衍生方法的应用占比达到81%。 在企业的敏捷转型历程中,Scru…...
深度解析qt核心机制:信号槽的多线程行为与对象的线程依附性
对象的线程依附性 每一个学过C以及系统编程的程序员,对于变量会与特定线程有关联都会感到不可思议;在qt中所说的对象的线程依附性,只是针对继承自QObject的对象而言的;对象的线程依附性,并不是代表真的某个底层线程才…...

关于时间格式yyyy-M-d或yyyy-MM-d到yyyy-MM-dd的转换
工作时遇到前端传的时间格式是"2023-12-3 17:41:52",和"2023-1-1 17:41:52"但是我想要的是"2023-12-03 17:41:52"和"2023-01-01 17:41:52"。下面给大家分享几个解决方法 方法一: 找前端!让他改&…...

【Windows】之微软输入法配置小鹤双拼
前言 Windows 自带的输入法微软输入法本身就是个最简洁、最方便的输入法,不需要去安装多余的第三方输入法软件。同时,微软中文拼音输入法支持双拼输入法,但微软自带的双拼输入法不包含小鹤双拼方案的。所以,在这里将会讲解如何配置…...

【AI】使用Jan.ai在本地部署大模型开启AI对话(含通过huggingface下载大模型,实现大模型自由)
文章目录 前言一、Jan.ai是什么?二、下载大模型1. 找到大模型文件地址2. 下载大模型3. 修改model.json文件 三、使用Jan调用大模型进行对话总结 前言 2023年是AIGC元年。以后,每个人多少都会接触到GPT带来的变化。别人都在用,我们也不能落下…...

C++摸版(初阶)----函数模版与类模版
本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…...

Embedded-Project项目介绍
Embedded-Project项目介绍 Server后端项目后端启动连接数据库启动时可能遇到的问题架构介绍 web前端项目前端启动启动时可能遇到的问题架构介绍 前后端分离开发流程 项目地址: https://github.com/Catxiaobai/Embedded-Project Server后端项目 系统后端项目&#…...
golang 的那些花样
从 A Tour of Go 可以看到一些 Go 比较特殊的点 文章目录 变量声明时,类型放在后面Array 的引用 Slicereceiver 和 argumentbuilt-int特殊接口Error 变量声明时,类型放在后面 var i, j int 1, 2declaration-syntax Array 的引用 Slice slices-intro …...

如何设计企业级业务流程?学习华为的流程六级分类经验
业务流程管理(BPM)是一种系统化的方法,用于分析、设计、执行、监控和优化组织的业务流程,以实现预期的目标和价值。业务流程管理中,流程的分级方法有多种,常见的有以下几种: APQC的流程分级方法…...

视频智能分析支持摄像头异常位移检测,监测摄像机异常位移变化,保障监控状态
我们经常在生产场景中会遇到摄像头经过风吹日晒,或者异常的触碰,导致了角度或者位置的变化,这种情况下,如果不及时做出调整,会导致原本的监控条件被破坏,发生事件需要追溯的时候,查不到对应位置…...

C++ UTF-8与GBK字符的转换 —基于Linux 虚拟机 (iconv_open iconv)
1、UTF-8 和 GBK 的区别 GBK:通常简称 GB (“国标”汉语拼音首字母),GBK 包含全部中文字符。 UTF-8 :是一种国际化的编码方式,包含了世界上大部分的语种文字(简体中文字、繁体中文字、英文、…...

云原生十二问
一、什么是云原生? 云原生是在云计算环境中构建、部署和管理现代应用程序的软件方法。现代企业希望构建高度可扩展、灵活且具有弹性的应用程序,可以快速更新以满足客户需求。为此,他们使用现代工具和技术,这些工具和技术本质上支…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...