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))

结果如下:
python--反射的使用--getattr,hasattr【,setattr,delattr】
一、获取类中的属性和方法

# 属性
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不说了