Loading

day 33 反射

1 什么是反射:

​ 指的是在程序运行过程中可以"动态(不见棺材不掉泪)"获取对象的信息。反射机制指的是在程序的运行状态中,对于任意一个类,都可以知道这个类的所有属性和方法;对于任意一个对象,都能够调用他的任意方法和属性。这种动态获取程序信息以及动态调用对象的功能称为反射机制。

2 为何要用反射

别人给我们一个类时,我们需要知道这个类里面有没有我们要的属性

3 如何实现反射?

​ 在python中实现反射非常简单,在程序运行过程中,如果我们获取一个不知道存有何种属性的对象,若想操作其内部属性,可以先通过内置函数dir来获取任意一个类或者对象的属性列表,列表中全为字符串格式

>>> class People:
...     def __init__(self,name,age,gender):
...         self.name=name
...         self.age=age
...         self.gender=gender
... 
>>> obj=People('egon',18,'male')
>>> dir(obj) 	# 列表中查看到的属性全为字符串
[......,'age', 'gender', 'name']

​ 接下来就是想办法通过字符串来操作对象的属性了,这就涉及到内置函数hasattr、getattr、setattr、delattr的使用了(Python中一切皆对象,类和对象都可以被这四个函数操作,用法一样)

class Teacher:
    def __init__(self,full_name):
        self.full_name =full_name

t=Teacher('Egon Lin')

# hasattr(object,'name')
hasattr(t,'full_name') # 按字符串'full_name'判断有无属性t.full_name

# getattr(object, 'name', default=None)
getattr(t,'full_name',None) # 等同于t.full_name,不存在该属性则返回默认值None

# setattr(x, 'y', v)
setattr(t,'age',18) # 等同于t.age=18

# delattr(x, 'y')
delattr(t,'age') # 等同于del t.age

实现反射机制的步骤

1 先通过 dir:查看出某一个对象下有哪些属性

print(dir(obj))

2 可以通过字符串反射到真正的属性上,得到属性值

print(obj.__dict__[dir(obj)[-2]])

四个内置函数的使用: 通过字符串来操作属性值

  • 1 hasattr() 有

     print(hasattr(obj,'name'))
    
     print(hasattr(obj,'x'))
    
  • 2 getattr() 获取

     print(getattr(obj,'name'))
    
  • 3 setattr() 设置

     setattr(obj,'name','EGON')   # obj.name='EGON'
    
     print(obj.name)
    
  • 4 delattr() 删除

    delattr(obj,'name')           # del obj.name
    print(obj.__dict__)
    
  • 应用

点击查看代码
 res1=getattr(obj,'say')     # obj.say
 res2=getattr(People,'say')  # People.say

 print(res1)
 print(res2)
>>>>>>>>>>>>>>>>>>>>>>>
 obj=10

 if hasattr(obj,'x'):
	 print(getattr(10,'x'))
 else:
	 pass

 print(getattr(obj,'x',None))   # 没有默认返回None

 if hasattr(obj,'x'):
	 setattr(obj,'x',111111111) # 10.x=11111
 else:
 	pass
>>>>>>>>>>>>>>>>>>>>>>>
 class Ftp:
 	 def put(self):
		 print('正在执行上传功能')

	 def get(self):
		 print('正在执行下载功能')

	 def interactive(self):
		 method=input(">>>: ").strip()   # method='put'

		 if hasattr(self,method):
			 getattr(self,method)()
		 else:
			 print('输入的指令不存在')

 obj=Ftp()
 obj.interactive()
posted @ 2021-12-05 21:57  maju  阅读(26)  评论(0)    收藏  举报