一 反射
1.1 什么是反射
指的是在程序运行过程中可以"动态(不见棺材不掉泪)"获取对象的信息
反射机制指的是在程序的运行状态中,对于任意一个类,都可以知道这个类的所有属性和方法;对于任意一个对象,都能够调用他的任意方法和属性。
1.2 如何使用反射
实现反射机制的步骤
1.先通过多dir:查看出某一个对象下可以.出哪些属性来
class People: def __init__(self,name,age): self.name=name self.age=age def say(self): print('<%s:%s>' %(self.name,self.age)) obj=People('辣白菜同学',18) print(dir(obj)) #[...., 'age', 'name', 'say']
2.想办法通过字符串来操作对象的属性:这就涉及到内置函数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')#判断有无属性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
基于反射可以十分灵活地操作对象的属性,比如将用户交互的结果反射到具体的功能执行
class Ftp: def get(self): print('正在执行下载功能') def put(self): print('正在执行上传功能') def interactive(self): cmd = input('输入命令:').strip() if hasattr(self,cmd): getattr(self,cmd)() else: print('输入命令不存在') obj = Ftp() obj.interactive()
二 内置方法
2.1 什么是内置方法
定义在类内部,以__开头并以__结果的方法
特点:会在某种情况下自动触发执行
2.2 为什么要有内置方法
为了定制化我们的类or对象
2.3 如何使用内置方法
__str__方法会在对象被打印时自动触发,print功能打印的就是它的返回值,我们通常基于方法来定制对象的打印信息,该方法必须返回字符串类型
class People: def __init__(self,name,age): self.name = name self.age = age def __str__(self): return "<%s:%s>" %(self.name,self.age) obj = People('qqq',18) print(obj)
__del__:在清理对象时触发,会先执行该方法
class People: def __init__(self,name,age): self.name = name self.age = age self.x = open('a.txt',mode='w')# self.x = 占据的是操作系统资源 def __del__(self):# 在对象obj被删除时,自动触发obj.__del__() self.x.close() obj = People('qqq',18)