1 Star 0 Fork 0

小凡 / python高级文档

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
反射方法.md 2.65 KB
一键复制 编辑 原始数据 按行查看 历史
xiaofan 提交于 2023-12-09 18:29 . 文档完善

反射

运行时,区别于翻译时,指的是程序被加载到内存中执行的时候。 反射,reflection,指的是运行时获取类型定义信息。 一个对象能够在运行时,像照镜子一样,反射出其类型信息。简单说,在Python中,能够通过一个对象,找出其type、class、attribute或method的能力,称为反射或自省。 具有反射能力的函数有type(),isinstance(),callable().dir().getattr()等

反射相关的函数和用法

class Point:
    def __init__(self,x,y):
        self.x=x
        self.y=y
    def __str__(self):
        return "{} and {}".format(self.x,self.y)
    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.z=10
print(p.__dict__)
print(dir(p))
print(sorted(p.__dir__()))

在这里插入图片描述 上例通过属性字典__dict__来访问对象的属性,本质上就是利用反射的能力,但是上面的例子中,访问的方式不优雅,Python提供了内置的函数

内建函数 意义
getattr(object,name[,default]) 通过name返回object的属性值,当属性不存在,将属性不存在,将使用default返回,如果没有default,则抛出AttributeError,name必须是字符串
setattr(object,name,value) object的属性,则覆盖,不存在则新增
hasaattr(object,name) 判断对象是否有这个名字的属性,name必须为字符串
class Point:
    def __init__(self,x,y):
        self.x=x
        self.y=y
    def __str__(self):
        return "{}{}".format(self.x,self.y)
    def show(self):
        print(self)
p1=Point(4,5)
p2=Point(10,10)
print(repr(p1),repr(p2))
print(p1.__dict__)
setattr(p1,'y',16)
setattr(p1,'z',10)
print(getattr(p1,'__dict__'))
#动态调用方法
if hasattr(p1,'show'):
    print(getattr(p1,'show'))
# 动态增加方法
if not hasattr(Point,'add'):
    setattr(Point,'add',lambda self,other: Point(self.x+other.x,self.y+other.y))
print(Point.add)
print(p1.add)
print(p1.add(p2))

在这里插入图片描述

#为实例增加方法,
#为实例增加方法,
if not hasattr(p1,'sub'):
    setattr(p1,'sub',lambda self,other: Point(self.x-other.x,self.y-other.y))
print(p1.sub(p1,p2))
print(p1.__dict__)
print(Point.__dict__)

在这里插入图片描述

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/xiaofan797/python-advanced-document.git
git@gitee.com:xiaofan797/python-advanced-document.git
xiaofan797
python-advanced-document
python高级文档
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891