python--反射的使用--getattr,hasattr【,setattr,delattr】
反射的使用使调用更加简单
# 反射.py
class A:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def work(self):
return self.name+'的工作是吃饭'
a = A('张三', 12, '男')
加入现在有一个类如上,并实例化了
现在需要调用a的姓名的话,通常的做法就是
a.name
使用反射
getattr(a, 'name')
看着好像更麻烦了,但是并不是那么简单的
比如我输入name,给我返回name的值,输入age,返回age的值。。。。
ret = input('>>> ')
print(getattr(a, ret))
结果如下:
一、获取类中的属性和方法
# 属性
getattr(a, 'name') # 张三
# 方法
ret = getattr(a, 'work') # <bound method A.work of <__main__.A object at 0x02E7E670>>
ret() # 调用 ---> 张三的工作是吃饭
二、调用导入模块的属性和方法
假如有一个mygetattrtext.py文件
day = 2018
class Person:
name = '李四'
age = 30
gender = '男'
def work(self):
return '看电视'
# 反射.py
from mygetattrtest import Person, day # 导入模块
p = Person() # 实例化对象
# 属性
getattr(p, 'name') # 李四
# 方法
ret = getattr(p, 'work')
ret() # 看电视
# ----------------
# 反射导入模块的day属性
import sys
from mygetattrtest import day
getattr(sys.modules[__name__], 'day')
三、反射自己的模块的属性和方法
# 反射.py
year = 2019
def eat():
return '我正在吃饭'
import sys
# 反射自己模块的属性
getattr(sys.modules[__name__], 'year') # 2019
# 反射自己模块的方法(函数)
ret = getattr(sys.modules[__name__], 'eat')
ret() # 我正在吃饭
hasattr
判断有没有呗
class A:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def work(self):
return self.name+'的工作是吃饭'
# print(A.name) # 一般的写法
a = A('张三', 12, '男')
# --------------------------------hasattr
if hasattr(a, 'name'):
print(getattr(a, 'name')) # 张三
else:
print('找不到')
注意:hasattr中的参数和getattr中的参数是一致的,否则判断不就没用了吗
setattr和selattr不说了