本文主要是介绍Python中类的魔术方法之--反射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- Python中类的魔术方法之--反射
- 概述
- 与反射相关的内建函数
- 反射相关的魔术方法
- `__getattr__(self,item)`方法
- `__setattr__(self,item)`方法
- `__delattr__(self,item)`方法
- `__getattribute__(self,item)`方法
- 附加:访问流程图
Python中类的魔术方法之–反射
概述
运行时,区别于编译时,指的是程序被加载到内存中执行的时候。
反射,reflection,指的是运行时获取类型定义信息。
一个对象能够在运行时,像照镜子一样,反射出其类型信息。
简单说,在Python中,能够通过一个对象,找出其type、class、attribute或method的能力,称为反射或者自 省。
具有反射能力的函数有 type()、isinstance()、callable()、dir()、getattr()等
示例:为类动态添加属性:
class Point:def __init__(self,x,y):self.x = xself.y = ydef __str__(self):return "Point({},{})".format(self.x,self.y)__repr__ = __str__def show(self):print(self.x,self.y)p = Point(4,5)
print(p)
print(p.__dict__)
p.__dict__["y"] = 16 #为对象动态修改属性值
print(p.__dict__)
p.__dict__["a"] = 10 #为对象动态添加属性值
print(p.__dict__)
p.z = 10 #为对象动态增加属性
print(p.__dict__)
print("dir查看p的属性",dir(p))
print("******************************")
print(dir(Point))
# Point.__dict__["h"] = 100 #报错出现TypeError异常。type(Point.__dict__) = mappingproxy
setattr(Point,"h",100) #动态为类对象添加属性
Point.hh = 100 #动态为类对象添加属性
print(dir(Point))
print("dir查看p的属性",dir(p))
print(type(Point.__dict__))
上例通过属性字典__dict__来访问对象的属性,本质上也是利用的反射的能力。
但是,上面的例子中,访问的方式不优雅,Python提供了内置的函数。
与反射相关的内建函数
内建函数 | 意义 |
---|---|
getattr(object,name[,default]) | 通过name返回object的属性值。当属性不存在,将使用default返回,如果没有default,则会抛出AttributeError异常。name必须为字符串 |
setattr(object,name,value) | object的属性存在,则覆盖,不存在,新增 |
hasattr(object,name) | 判断对象是否有这个名字的属性,name必须为字符串 |
- 简单演示:
class Point:def __init__(self,x,y):
这篇关于Python中类的魔术方法之--反射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!