python学习笔记DAY20(面向对象编程-反射)
这是我个人的学习笔记,都赖于(egon老师)的分享,以下是老师博客的原地址:
https://www.cnblogs.com/xiaoyuanqujing/articles/11640888.html
面向对象编程_反射
反射、内置方法
前置说明:
class Teacher:
def __init__(self,name):
self.full_name = name
obj = Teacher("yunya")
# print(dir(obj)) # 查看对象可以 . 出的全部 属性
# ['__class__', '__delattr__', '__dict__',..., 'full_name']
print(obj.__dict__) # 查看对象包含的所有属性及对应的属性值
print(obj.__dict__[dir(obj)[-1]]) # yunya
如上:通过dir和dict确实可以用字符串的属性名,访问到属性值。但是,__ 开头的方法基本都是在满足某种条件下用来自动触发的,最好不要主动调用。而且,不是所有对象都有dict 方法的。
1、反射
反射指的是可以在程序运行过程中可以"动态"获取对象的信息。
- 在程序的某个位置,你获取到了OBJ这个对象,现在让你调取里面的属性。(不止对象从何而来,该如何调用属性?)
- dir(obj) 可以查看某一个对象下可以 . 出的全部属性(但是此时,dir列出的属性都是字符串类型,不可直接调用)
- 这时可以通过操作字符串反射到真正的属性上,得到属性值
- 在python中,反射指的是通过字符串来操作对象的属性,涉及到四个内置函数的使用:
hasattr(obj,"name") # True 判断一个属性是否在一个对象中
getattr(obj,"name") # yunya 从对象中获取对应属性
setattr(obj,"name","云崖") # 修改属性值
getattr(obj,"name") # 云崖
delattr(obj,"name") # 删除属性
实例1:
print(getattr(obj,"x")) # 直接获取一个属性,如果属性不存在就会报错
if hasattr(obj,"x"): # 先判断要查询的属性是否存在于当前对象
print(getattr(obj,"x")) # 如果存在,就获取
else:
print("此对象没有x这个属性")
实例2:
class Ftp:
def put(self):
print("正在执行上传功能")
def get(self):
print("正在执行下载功能")
def interactive(self):
method = input("--->").strip() # 用户输入任意属性名
if hasattr(self,method): # 如果属性名存在
func = getattr(self,method) # 得到属性值
func()
else:
print("输入的指令不存在") # 属性名不存在,给出提示
obj = Ftp()
obj.interactive()
2、内置方法
python的class机制内置了很多特殊的方法来帮助使用者高度定制自己的类,这些内置方法都是以双下划线开头和结尾的。
特点:会在满足某种条件时自动触发。
实例1:
_str__方法会在被对象打印时自动触发,print功能打印的就是它的返回值,我们通常基于方法来定制对象的打印信息,该方法必须返回字符串类型。
class People:
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name,self.age}" # 返回值类型必须是字符串
p = People("nida",19)
print(p) # 触发p.__str__(),拿到返回值进行打印 ('nida', 19)
实例2:
del_会在对象呗删除时自动触发。由于python自带垃圾回收机制,会自动清理python程序的资源,所以当一个对象只占用应用程序资源时,完全没有必要为对象定制del_方法,但产生一个对象的同时涉及到申请系统资源(比如系统打开的文件,网络连接等)的情况下,关系系统资源的回收,python的垃圾回收机制就没用了,需要我们为对象定制该方法,用来在对象删除时,自动触发回收系统资源的操作:
class MySQL:
def __init__(self,ip,port):
self.conn = connect(ip,port) # 发起网络连接,需要占用系统资源
def __del__(self):
self.conn.close() # 关闭网络连接,回收系统资源
obj = MySQL("172.16.31",8007)
del obj # 在对象obj被删除时,自动触发obj.__del__

浙公网安备 33010602011771号