Python面向对象-反射
python面向对象-反射
在python的面向对象中,与用户交互的主要方式就是利用反射来判断用户输入的指令是否存在和可执行
反射的定义
在python中反射主要是应用于类的对象上,在运行时,将对象的属性和方法发射出来使用场景
可以动态的向对象中添加属性和方法,同样可以动态的调用对象中的方法或者属性反射的四中常用方法
1. hasattr(obj,str)
判断输入的stt字符串在对象obj中是否存在(属性或方法)存在返回True,不存在返回False
2. getattr(obj,str)
将按照输入的str字符串在对象obj中查找,如找到同名属性,则返回该属性,如找到同名方法,则返回改方法的引用,
想要调用此方法需要使用 getattr(obj,str)() 进行调用
如果未找到同名的属性或者方法,则会抛出异常AttributeError,一般于hasattr配合使用
3. setattr(obj,name,value)
name为属性名或者方法名,value为属性值或者方法的引用
1)动态添加属性 setattr(obj, name, value) 无则添加,有则修改
2)动态添加方法,需要先定义一个方法,再使用setattr(对象名,想要定义的方法名,所定义方法的方法名)
4. delattr(obj,str)
将你输入的字符串str在对象obj中查找,如果找到同名的属性或者方法就进行删除# 反射四种方法代码演示
class Dog(object):
def __init__(self, name):
self.name = name def eat(self):
print(f'{self.name} 正在吃东西....')
dog = Dog('二哈') # hasattr()的使用
str = input('请输入你需要判断的属性名或者方法名:')
print(hasattr(dog, eat)) # 返回True ,对象中确实有eat这个方法
print(hasattr(dog, age)) # 返回false,对象中无这个方法和属性 # getattr()的使用
str = input('请输入你需要判断的属性名或者方法名:')
print(getattr(dog, str)) # 输入name,返回二哈,dog对象中有这个属性,输入age报错AttributeError 对象dog中没有这个属性
print(getattr(dog, str)) # 输入eat,返回<bound method Dog.eat of <__main__.Dog object at 0x104e2cfd0>> ,对象中有这个绑定方法,如果没有同报错 # setattr()的使用
name = input('请输入想要添加的属性名:') # 第一次输入age ,第二次输入age
value = input('请输入想要添加的属性值:') # 第一次输入 18 ,第二次输入19
setattr(dog, name, value)
print(getattr(dog, name)) # 第一次对象中没有age这个属性则直接添加age=18, 第二次输入age=19 则直接修改属性age=19
# 添加方法
name = input('请输入想添加的方法:')
def run():
print('二哈正在奔跑。。。') # 先定义一个方法 setattr(dog, name, run) # 此时的run为函数run的引用,函数的作为变量名的传值方式,(相当于指针指向run函数)
getattr(dog, name)() # 使用getattr加() 的方式调用函数,得到二哈正在奔跑。。。 # delattr()的使用
str = input('请输入想要删除的属性名或方法名:')
print(getattr(dog,str)) # 获取dog对象中的name属性,值为二哈
delattr(dog, str) # 删除dog对象中的name属性
print(getattr(dog,str)) # 再次获取obj对象中的name属性,由于已经被删除,则抛出异常AttributeError
```
Python面向对象-反射的更多相关文章
- python -- 面向对象 - 反射
1.isinstance ,type, issubclass isinstance:判断给的对象是否是**类型 type:返回**对象的数据类型 issubclas ...
- python面向对象 : 反射和内置方法
一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类 (注:type(对象名) is 类名 : 判断对象所属 ...
- python面向对象反射-框架原理-动态导入-元类-自定义类-单例模式-项目的生命周期-05
反射 reflect 反射(reflect)其实是反省,自省的意思 反省:指的是一个对象应该具备可以检测.修改.增加自身属性的能力 反射:通过字符串获取对象或者类的属性,进行操作 设计框架时需要通过反 ...
- python 面向对象反射以及内置方法
一.反射 什么是反射:可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对象,都可以使用放射. 反射的四种方法: hasattr:hasattr(objec ...
- python面向对象(反射)(四)
1. isinstance, type, issubclass isinstance: 判断你给对象是否是xx类型的. (向上判断 type: 返回xxx对象的数据类型 issubclass: 判断x ...
- python面向对象--反射机制
class Black: feture="ugly" def __init__(self,name,addr): self.addr=addr self.name=name def ...
- Python 面向对象之反射
Python 面向对象之反射 TOC 什么是反射? hasattr getattr setattr delattr 哪些对象可以使用反射 反射的好处 例子一 例子二 什么是反射? 程序可以访问.检查和 ...
- Python面向对象之-反射
Python中一切皆对象,在Python中的反射:通过字符串的形式操作对象的属性 hasattr 判断是否有改属性或者方法,有返回True,没有返回false getattr 如果是属性获得该属性 ...
- python 面向对象编程 之 反射
1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...
- Python之面向对象-反射
一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问,检测和修改它本省状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...
随机推荐
- Nginx https证书生成
一.证书和私钥的生成 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 1.创建服务器证书密钥文件 server.key: ...
- Qt/C++编写全能播放组件(支持ffmpeg2/3/4/5/6/Qt4/5/6)
一.前言 从代码层面以及自由度来说,用ffmpeg来写全能播放组件是最佳方案(跨平台最好最多.编解码能力最强),尽管已经有优秀的vlc/mpv等方案可以直接用,但是vlc/mpv对标主要是播放器应用层 ...
- 安装Visual Studio2015后找不到C++项目模板解决办法
安装Visual Studio2015后找不到C++项目模板解决办法: 方法1:您可以通过修改Visual Studio来完成此操作,并且可以使用以下步骤完成此操作:1.转到"添加或删除程序 ...
- IM开发干货分享:如何优雅的实现大量离线消息的可靠投递
1.点评 IM聊天消息的可靠投递,是每个线上产品都要考虑的IM热点技术问题. IM聊天消息能保证可靠送达,对于用户来说,就好比把钱存在银行不怕被偷一样,是信任的问题.试想,如果用户能明显感知到聊天消息 ...
- IM通讯协议专题学习(六):手把手教你如何在Android上从零使用Protobuf
本文由sweetying分享,为了更好的阅读体验,有较多的内容修订和排版优化. 1.前言 最近我负责的 LiveChat 客服聊天系统到了自研阶段,任务类似于做一个腾讯云IM这样的通信层SDK.在和后 ...
- CDS标准视图:维修工单实际成本数据 I_MaintOrderActualCostDataCube
视图名称:维修工单实际成本数据 I_MaintOrderActualCostDataCube 视图类型:基础 视图代码: 点击查看代码 @VDM.viewType: #COMPOSITE @AbapC ...
- 《C++并发编程实战》读书笔记(3):并发操作的同步
1.条件变量 当线程需要等待特定事件发生.或是某个条件成立时,可以使用条件变量std::condition_variable,它在标准库头文件<condition_variable>内声明 ...
- Kotlin:【泛型】
- Flu PG walkthrough Intermediate
nmap ┌──(root㉿kali)-[/home/ftpuserr] └─# nmap -p- -A 192.168.192.41 Starting Nmap 7.94SVN ( https:// ...
- Spaghetti pg walkthrough Intermediate
nmap ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.170.160 Starting Nmap 7.94SVN ( https://nmap.org ) a ...