11.1 反射
1、什么是反射
反射机制指的是在程序的运行状态中
对于任意一个类,都可以知道这个类的所有属性和方法;
对于任意一个对象,都能够调用他的任意方法和属性。
这种动态获取程序信息以及动态调用对象的功能称为反射机制。
2、为什么要用反射
函数接收到一个参数后,要去判断里面是否有属性可以去访问
3、如何实现反射
class People: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def say(self): pass obj = People('upup',12,'男') # 实现反射的步骤 # 1.先通过dir 查看出某一个对象下可以.出哪些属性来 print(dir(obj)) # 2.可以通过字符串反射到真正的属性上,得到属性值 # print(obj.__dict__[dir(obj)[-2]]) # 四个内置函数的使用 # hasatter() 判断某一个属性在不在对象里面 # print(hasattr(obj,'name')) # True # getattr() 获取属性 print(getattr(obj,'name')) # upup # setattr() 赋值属性 print(setattr(obj,'name','UP')) print(obj.name) # UP # delattr() 删除属性 delattr(obj,'name') # print(getattr(obj,'say')) # 如果没有这个属性值,也不会报错的方式 if hasattr(10,'x'): print(getattr(10,'x')) else: pass print(getattr(10,'x',None)) if hasattr(10,'x'): setattr(obj,'x',12) else: pass
11.2内置方法
1、什么是内置方法
定义在类内部,以两个下划线开头并以两个下划线结束的的方法
特点:会在某种情况下自动触发并执行
2、为何要使用内置方法
为了定制类、对象
3、如何使用内置方法
str方法
# __str__:会在对象被打印时自动触发,print功能打印的就是它的返回值,通常基于方法来定制对象的打印信息,该方法必须返回字符串类型 class People: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def __str__(self): print('%s:%s' % (self.name,self.age)) return 'haha' obj1 = People('upup',12,'男') print(obj1) # upup:12 # haha
del方法
# __del__:在清理对象时候触发,会先执行该方法 # 发起系统调用,告诉操作系统回收相关的系统资源 class People: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def __del__(self): pass obj1 = People('upup',12,'男') print(obj1)
11.3元类
1、什么是元类
因为一切皆为对象,如果说类也是对象,元类就是用来实例化产生类的类
# 关系:元类---实例化---->类(People)---实例化---->对象(obj) class People: def __init__(self,name,age): self.name=name self.age=age def say(self): print('%s:%s' %(self.name,self.name)) # print(People.__dict__) # 如何得到对象 # obj=调用类() obj=People('egon',18) # print(type(obj)) # 如果说类也是对象 # People=调用类(。。。) # 查看内置的元类: # 1、type是内置的元类 # 2、我们用class关键字定义的所有的类以及内置的类都是由元类type实例化产生 print(type(People)) print(type(int))
class机制分析
# class 关键字创造类people的步骤 # 类有三大特征: # 1.类名 class_name = 'People' # 2.类的基类 class_bases = (object) # 3.通过执行类体代码,拿到类的名称空间 class_dic = {} class_body = """ def __init__(self,name,age): self.name=name self.age=age def say(self): print('%s:%s' %(self.name,self.name)) """ exec (class_body,{},class_dic) print(class_dic) # 4.调用元类,调用内置的元类 People = type(class_name,class_bases,class_dic)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用