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)
浙公网安备 33010602011771号