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 :是一种国际化的编码方式,包含了世界上大部分的语种文字(简体中文字、繁体中文字、英文、…...
云原生十二问
一、什么是云原生? 云原生是在云计算环境中构建、部署和管理现代应用程序的软件方法。现代企业希望构建高度可扩展、灵活且具有弹性的应用程序,可以快速更新以满足客户需求。为此,他们使用现代工具和技术,这些工具和技术本质上支…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
