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. 哪里有 class 告诉我?

    说明 本文中的 JVM 参数和代码在 JDK 8 版本生效. 哪里有用户类? 用户类是由开发者和第三方定义的类,它是由应用程序类加载器加载的. Java 程序可以通过CLASSPATH 环境变量,JV ...

  2. B站千万级长连接实时消息系统的架构设计与实践

    本文由哔哩哔哩资深开发工程师黄山成分享,原题"千万长连消息系统",本文进行了排版和内容优化等. 1.引言 在当今数字娱乐时代,弹幕已经成为直播平台上不可或缺的互动元素之一. 用户通 ...

  3. IM开发干货分享:浅谈IM系统中离线消息、历史消息的最佳实践

    本文由融云技术团队原创分享,原题"IM 消息数据存储结构设计",内容有修订. 1.引言 在如今的移动互联网时代,IM类产品已是我们生活中不可或缺的组成部分.像微信.钉钉.QQ等是典 ...

  4. 架构-初识DDD

    引言 继上一篇BFF的文章后,我又去网上学习了一下DDD(领域驱动设计),发现一篇不错的文章,参考并写了一些自己的理解分享在这里. DDD 是什么 领域驱动设计(Domain Driven Desig ...

  5. preparation

    课程知识准备 HTML5基础教程 CSS3基础教程 JavaScript基础教程 HTML DOM基础教程 VUE3基础教程 Element Plus OpenLayers vue3-openlaye ...

  6. 2021 年万圣节 Github 彩蛋

    记录每年 Github 万圣节彩蛋,也记录有来项目成长历程. 2021 万圣节彩蛋 2020 万圣节彩蛋

  7. (八).NET6.0添加通用的Redis功能

    1.添加包:StackExchange.Redis 2.在配置文件里面,新建Redis的有关配置信息 Name是别名,可以任意起.Ip是Redis的服务端地址,例如安装本地,就是127.0.0.1,端 ...

  8. Mybatis插入数据后返回主键

    添加记录后获取主键ID,这是一个很常见的需求,特别是在一次前端调用中需要插入多个表的场景. 除了添加单条记录时获取主键值,有时候可能需要获取批量添加记录时各记录的主键值,MyBatis从3.3.1版本 ...

  9. ffmpeg 去除音频中的静音

    去除音频中的静音 //去除所有超过0.3秒的静音部分 ffmpeg -i input.mp3 -af silenceremove=stop_periods=-1:stop_duration=0.3:s ...

  10. 2020年最新Redis面试题-copy

    什么是Redis Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库. Redis 可以存储键和 ...