python类的反射
反射
通过字符串映射或者修改程序运行时的状态、属性、方法, 有一下4个方法
小例子--根据用户输入调用方法:
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self):
print("%s is eating..",self.name)
d= Dog('二哈')
choice = input(">>:").strip()
d.choice()
=========执行结果===========
>>:eat
Traceback (most recent call last):
File "E:/pywww/day06/11.py", line 13, in <module>
d.choice
AttributeError: 'Dog' object has no attribute 'choice'
这里用户输入的只是一个字符串,所以不会把输入的内容当作类的方法执行。
最原始的办法就是加个判断,然后判断输入的字符串是不是在这个类里有这个方法,但是这种灵活度不好。所以可以用到下面这种方法。
hasattr(obj,name_str)
输入一个字符串,判断对象有没有这个方法。
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self):
print("%s is eating.."% self.name)
d= Dog('二哈')
choice = input(">>:").strip() #eat
print(hasattr(d,choice)) #True
getattr(obj,name_str)
如果是方法返回对象的内存地址,如果是属性直接返回该属性的值
print(getattr(d,choice)) #<bound method Dog.eat of <__main__.Dog object at 0x0000000000A72358>>
如果是一个不存在的方法会报错:AttributeError: 'Dog' object has no attribute 'aa'
既然是地址就说明加上括号就可以调用了:
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self):
print("%s is eating.."% self.name)
d= Dog('二哈')
choice = input(">>:").strip() #eat
getattr(d,choice)() #二哈 is eating..
以上两个方法可以组合起来使用:
if hasattr(d,choice):
getattr(d,choice)() #二哈 is eating..
也可以赋值给一个变量,然后传参给方法
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("%s is eating.."% self.name,' like ',food)
d= Dog('二哈')
choice = input(">>:").strip() #eat
if hasattr(d,choice):
func = getattr(d,choice)
func('包子') #二哈 is eating.. like 包子
setattr(x,'y',v) x.y = v
添加一个方法
def bulk(self): #先定义要添加的方法
print('%s wang wang wang' % self.name) class Dog(object): def __init__(self,name):
self.name = name def eat(self,food):
print("%s is eating.."% self.name,' like ',food) d= Dog('二哈')
choice = input(">>:").strip() #bulk
if hasattr(d,choice):
func = getattr(d,choice)
func('包子')
else:
setattr(d,choice,bulk)
d.bulk(d) #bulk 是你输入的字符串 ,这里要把d传进去,不然提示你少传一个参数进去
上面是动态装载一个方法,也可以动态装载一个属性
setattr(d,choice,22) #age
print(getattr(d,choice)) #22
delattr(obj,name_str)
动态删除属性或方法
delattr(d,choice)
python类的反射的更多相关文章
- Python类总结-反射及getattr,setattr
类反射的四个基本函数 hasattr getattr setattr delattr #反射 class BlackMedium: feature = 'Ugly' def __init__(self ...
- python类的反射使用方法
曾经,博主的房东养了只金毛叫奶茶,今天就拿它当议题好了. 博主写本文时正在被广州的蚊子围攻. #反射练习 class animal(object): def __init__(self,name,fo ...
- Python类(五)-反射
反射即通过字符串映射或修改程序运行时的状态.属性.方法 有4个方法: hasattr(): hasattr(object,string):object为实例化的对象,string为字符串 判断对象ob ...
- python(7)– 类的反射
python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...
- python面试题~反射,元类,单例
1 什么是反射?以及应用场景? test.py def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): ...
- python基础-类的反射
1)反射是通过字符串方式映射内存中的对象. python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr, 改四个函数分别用于对对象内部执行:检查是 ...
- python中的反射
在绝大多数语言中,都有反射机制的存在.从作用上来讲,反射是为了增加程序的动态描述能力.通俗一些,就是可以让用户参与代码执行的决定权.在程序编写的时候,我们会写很多类,类中又有自己的函数,对象等等.这些 ...
- python面向对象进阶 反射 单例模式 以及python实现类似java接口功能
本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和特性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存 ...
- Python之路- 反射&定制自己的数据类型
一.isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 issubclass(sub, super)检查sub类是否是 super ...
随机推荐
- 11.Find All Numbers Disappeared in an Array(找出数组中缺失的数)
Level: Easy 题目描述: Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements ...
- error : Could not load UI satellite dll 'TrackerUI.dll'. Make sure it exists in an LCID subdirectory of 'C:\Program Files (x86)\MSBuild\12.0\bin\'.
原因 VS2013 + QT环境部署好后, 又安装了VS2015\ 解决方案: 在另一台电脑里重装VS2013, 并将 C:\Program Files (x86)\MSBuild\12.0\B ...
- linux学习3(vim)
一.文档编辑 1. vi和vim命令 Vim的打开文件的方式(4种,要求掌握的就前三种): 1. vim 文件路径 ...
- ssh两台主机建立信任关系
A主机(10.104.11.107) B主机(10.104.11.128) A: ssh-keygen -t rsa [root@H0f .ssh]# ssh-keygen -t rsa Gene ...
- Hive 遇到 Class path contains multiple SLF4J bindings
Hive 遇到 Class path contains multiple SLF4J bindings Root Issue; slf4j在两处找到了jar包.分别是在Hadoop和hive的安装目录 ...
- grunt 安装使用(一)
grunt 依赖nodejs,所有在使用前确保你安装了nodejs,然后开始执行grunt命令. .安装node nodejs安装教程 安装完成后在命令行,执行命令: node -v 出现版本信息, ...
- python_文件的打开和关闭
文件对象 = open('文件名','使用方式')rt:读取一个txt文件wt: 只写打开一个txt文件,(如果没有该文件则新建该文件)会覆盖原有内容at:打开一个txt文件,并从文件指针位置追加写内 ...
- Linux 进程间通信之管道(pipe),(fifo)
无名管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信: 定义函数: int pipe(int f ...
- Barty's Computer 字典树
https://nanti.jisuanke.com/t/17122 Barty have a computer, it can do these two things. Add a new stri ...
- 宋宝华: 关于Linux进程优先级数字混乱的彻底澄清
宋宝华: 关于Linux进程优先级数字混乱的彻底澄清 原创: 宋宝华 Linux阅码场 9月20日 https://mp.weixin.qq.com/s/44Gamu17Vkl77OGV2KkRmQ ...