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面向对象-反射的更多相关文章

  1. python -- 面向对象 - 反射

    1.isinstance ,type, issubclass       isinstance:判断给的对象是否是**类型       type:返回**对象的数据类型       issubclas ...

  2. python面向对象 : 反射和内置方法

    一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类  (注:type(对象名) is 类名 : 判断对象所属 ...

  3. python面向对象反射-框架原理-动态导入-元类-自定义类-单例模式-项目的生命周期-05

    反射 reflect 反射(reflect)其实是反省,自省的意思 反省:指的是一个对象应该具备可以检测.修改.增加自身属性的能力 反射:通过字符串获取对象或者类的属性,进行操作 设计框架时需要通过反 ...

  4. python 面向对象反射以及内置方法

    一.反射 什么是反射:可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对象,都可以使用放射. 反射的四种方法: hasattr:hasattr(objec ...

  5. python面向对象(反射)(四)

    1. isinstance, type, issubclass isinstance: 判断你给对象是否是xx类型的. (向上判断 type: 返回xxx对象的数据类型 issubclass: 判断x ...

  6. python面向对象--反射机制

    class Black: feture="ugly" def __init__(self,name,addr): self.addr=addr self.name=name def ...

  7. Python 面向对象之反射

    Python 面向对象之反射 TOC 什么是反射? hasattr getattr setattr delattr 哪些对象可以使用反射 反射的好处 例子一 例子二 什么是反射? 程序可以访问.检查和 ...

  8. Python面向对象之-反射

    Python中一切皆对象,在Python中的反射:通过字符串的形式操作对象的属性 hasattr  判断是否有改属性或者方法,有返回True,没有返回false getattr  如果是属性获得该属性 ...

  9. python 面向对象编程 之 反射

    1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...

  10. Python之面向对象-反射

    一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问,检测和修改它本省状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...

随机推荐

  1. shell脚本实现Base64加解密

    暂时不支持中文字符 脚本: #!/bin/bash # ##################################################################### # ...

  2. JSchException: Algorithm negotiation fail问题解决之路

    最近一个需求用到了SFTP上传功能,同事之前已经封装好了SFTP工具类,用的是JSch,本着不要重复造轮子的想法,就直接拿来用了.交代下环境,JDK为1.7,JSch版本为0.1.51.自测通过.测试 ...

  3. mybatis-plus多表联合分页查询

    1.entity层要写个Vo实体类 2.controller @AutoLog(value = "员工CURD-分页列表查询")@ApiOperation(value=" ...

  4. P10936 导弹防御塔 题解

    题目链接 题目大意 城堡有 m 个敌人.n 个能发射导弹的防御塔.导弹的速度固定,都为 v.导弹需要 T1 秒发射,T2 分钟冷却,还需要防御塔到敌人距离的 dis/v 的时间.给定防御塔和敌人的坐标 ...

  5. Qt/C++音视频开发68-检查是否含有B帧/转码推流/拉流显示/监控拉流推流/海康大华宇视监控

    一.前言 为什么需要判断视频文件是否含有B帧,这个在推流的时候很容易遇到这个问题,一般来说,没有B帧的视频文件,解码后的数据帧pts和dts都是顺序递增的,而有B帧的则未必,可能有些需要先解码后面显示 ...

  6. Datawhale AI 夏令营-天池Better Synth多模态大模型数据合成挑战赛-task3持续上分(更新中)

    在大数据.大模型时代,随着大模型发展,互联网数据渐尽且需大量处理标注,为新模型训练高效合成优质数据成为新兴问题."天池 Better Synth - 多模态大模型数据合成挑战赛"应 ...

  7. 一种调试 线段树 / Treap / Splay / 左偏树 / LCT 等树形结构的技巧

    前言 如果我们需要观察程序运行过程中,某一个变量.某一个序列的变化情况,你可以在修改的地方打断点 debug,或者直接在需要的地方输出就行了. 但是对于一些树形结构,我们不好将其直观地呈现出来,常常只 ...

  8. 理解Java的接口和抽象类

    深入理解Java的接口和抽象类   对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多 不同的地方.很多人在 ...

  9. weixueyuan-Nginx核心配置指令2

    https://www.weixueyuan.net/nginx/config/ Nginx配置文件详解 Nginx 默认编译安装后,配置文件都会保存在 /usr/local/nginx/conf 目 ...

  10. 【Docker】---Docker入门篇(1)

    Docker入门篇 简单一句话: Docker 是一个便携的应用容器. 一.Docker的作用 网上铺天盖地的是这么说的: (1) Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得 ...