11、反射、内置方法

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)
posted on   AprilX  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示