反射

反射我们以后会经常用到,这个东西实现了动态的装配,通过字符串来反射类中的属性和方法

一、反射函数

1、hasarttr(obj,name_str)

作用:判断一个对象obj中是否有对应的name_str字符串的属性或者方法

class Dog(object):

    def __init__(self,name):
self.name = name def eat(self,food):
print("{0} is eating...{1}".format(self.name,food)) d = Dog("shabi")
choice = input(">>>:").strip() print(hasattr(d,choice)) #obj中是否有对应的choice字符串的属性或者方法 #输出
>>>:name #输入对象存在属性
True
>>>:eat #输入对象存在的方法
True

  

2、getattr(obj,name_str)

作用:根据字符串name_str获取obj对象中的对应方法的内存地址或者对应属性的值

class Dog(object):

    def __init__(self,name):
self.name = name def eat(self,food):
print("{0} is eating...{1}".format(self.name,food)) d = Dog("shabi")
choice = input(">>>:").strip() print(getattr(d,choice)) #choice获取obj对象中的对应方法的内存地址或者对应属性的值 #输出
>>>:name #返回name属性的值
shabi
>>>:eat
<bound method Dog.eat of <__main__.Dog object at 0x00000157A129CF28>> #返回eat方法的内存地址

  

3、setattr(x,y,z)

作用:给obj对象添加一个新属性或者新方法,setattr(x, 'y', v) is equivalent to ``x.y = v''

①给对象新增一个新方法

def bulk(self):  #先定义一个bulk函数
print("{0} is yelling...".format(self.name)) class Dog(object): def __init__(self,name):
self.name = name def eat(self,food):
print("{0} is eating...{1}".format(self.name,food)) d = Dog("shabi")
choice = input(">>>:").strip() setattr(d,choice,bulk) #输入的是talk,所以又等同于d.talk = bulk
#d.talk(d) 直接写死,用d.talk(d),一般不这么写
func = getattr(d,choice) #用getattr来获取
func(d) #输出
>>>:talk
shabi is yelling...

②给对象新增一个属性

class Dog(object):

    def __init__(self,name):
self.name = name def eat(self,food):
print("{0} is eating...{1}".format(self.name,food)) d = Dog("shabi")
choice = input(">>>:").strip() setattr(d,choice,22) #输入的是age,所以又等同于d.age = 22
# print(d.age) 这样就写死了,还是用下面一种
print(getattr(d,choice)) #输出
>>>:age
22

4、delattr(x,y)

作用:删除obj对象中的属性或者方法,delattr(x, 'y') is equivalent to ``del x.y''

class Dog(object):

    def __init__(self,name):
self.name = name def eat(self,food):
print("{0} is eating...{1}".format(self.name,food)) d = Dog("shabi")
choice = input(">>>:").strip() delattr(d,choice) #根据字符串删除属性或者方法
print(d.name)
print(d.eat) #输出
>>>:name #删除属性name
Traceback (most recent call last):
File "E:/PycharmProjects/pythontest/day7/反射/反射.py", line 22, in <module>
print(d.name)
AttributeError: 'Dog' object has no attribute 'name'
>>>:eat #删除方法eat
Traceback (most recent call last):
File "E:/PycharmProjects/pythontest/day7/反射/反射.py", line 21, in <module>
delattr(d,choice)
AttributeError: eat

5、综合使用hasattr、getattr、setattr

class Dog(object):

    def __init__(self,name):
self.name = name def eat(self,food):
print("{0} is eating...{1}".format(self.name,food)) d = Dog("shabi")
choice = input(">>>:").strip() if hasattr(d,choice): #判断d对象中存在属性和方法
name_value = getattr(d,choice) #获取属性值
print(name_value)
setattr(d,choice,"hong") #修改属性值
print(getattr(d,choice)) #重新获取属性的值
else:
setattr(d,choice,None) #设置不存在的属性值为None
v = getattr(d,choice)
print(v) #输出
>>>:name
shabi
hong
>>>:abc
None

【python】-- 类的反射的更多相关文章

  1. Python类总结-反射及getattr,setattr

    类反射的四个基本函数 hasattr getattr setattr delattr #反射 class BlackMedium: feature = 'Ugly' def __init__(self ...

  2. python类的反射使用方法

    曾经,博主的房东养了只金毛叫奶茶,今天就拿它当议题好了. 博主写本文时正在被广州的蚊子围攻. #反射练习 class animal(object): def __init__(self,name,fo ...

  3. Python类(五)-反射

    反射即通过字符串映射或修改程序运行时的状态.属性.方法 有4个方法: hasattr(): hasattr(object,string):object为实例化的对象,string为字符串 判断对象ob ...

  4. python类的反射

    反射 通过字符串映射或者修改程序运行时的状态.属性.方法, 有一下4个方法 小例子--根据用户输入调用方法: class Dog(object): def __init__(self,name): s ...

  5. python(7)– 类的反射

    python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...

  6. python面试题~反射,元类,单例

    1 什么是反射?以及应用场景? test.py def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): ...

  7. python基础-类的反射

    1)反射是通过字符串方式映射内存中的对象. python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr, 改四个函数分别用于对对象内部执行:检查是 ...

  8. python中的反射

    在绝大多数语言中,都有反射机制的存在.从作用上来讲,反射是为了增加程序的动态描述能力.通俗一些,就是可以让用户参与代码执行的决定权.在程序编写的时候,我们会写很多类,类中又有自己的函数,对象等等.这些 ...

  9. python面向对象进阶 反射 单例模式 以及python实现类似java接口功能

    本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和特性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存 ...

  10. Python之路- 反射&定制自己的数据类型

    一.isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 issubclass(sub, super)检查sub类是否是 super ...

随机推荐

  1. 【共享单车】—— React后台管理系统开发手记:UI菜单各个组件使用(Andt UI组件)

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  2. linux系统预留内存和磁盘大小

    默认情况下, Linux 会最多使用 40% 的可用内存作为文件系统缓存.当超过这个阈值后,文件系统会把将缓存中的内存全部写入磁盘, 导致后续的 IO 请求都是同步的. 将缓存写入磁盘时,有一个默认1 ...

  3. 标准库Queue的实现

    跟上篇实现stack的思路一致,我增加了一些成员函数模板,支持不同类型的Queue之间的复制和赋值. 同时提供一个异常类. 代码如下: #ifndef QUEUE_HPP #define QUEUE_ ...

  4. iOS项目开发实战——使用同步请求获取网页源码

    网络请求一般分为同步请求和异步请求,同步请求假设訪问时间过长,会造成界面卡死状态,用户体验不是非常好.可是请求速度较快的话,也能够考虑使用同步訪问.如今先来学习同步訪问. (1)在viewDidLoa ...

  5. statusbar的颜色设置

    步骤一.在info.plist文件中添加一行(key:View controller-based status bar appearance,value:NO) 步骤二.在appDelegate中,添 ...

  6. matplotlib表面三维图

    1.basic numpy.meshgrid 由一维数组到二维数组,用于生成网格数据 matplotlib python绘图库 2.code In [88]: from mpl_toolkits.mp ...

  7. windows下简单配置squid反向代理服务器

    下载windwosNT版本的squid下载地址: http://squid.acmeconsulting.it/download/squid-2.6.STABLE13-bin.zip 1.把squid ...

  8. webstore 与 热编译的配置冲突

    这个勾去掉就会自动编译了!

  9. linux 登陆key生成

    1.登录A机器 2.ssh-keygen -t rsa,将会生成密钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub Generating public/priv ...

  10. Swagger跨域访问

    我们用springboot开发完后,需要前端vue用swagger跨域,默认是不能跨域的,所以需要我们后台设置跨域访问,将下面代码完整复制即可. 在springboot项目中新建class : Cor ...