博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类特殊属性方法--反射
阅读量:6001 次
发布时间:2019-06-20

本文共 2284 字,大约阅读时间需要 7 分钟。

概述

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

反射相关的函数和方法

需求
有一个Point类,查看它实例的属性,并修改它。动态为实例增加属性

getattr(object,name[,default])

通过name返回object的name属性,当name属性不存在,将使用default返回,如果没有default,则抛出AttributeErrorname必须是字符串类型default是函数,因为getattr返回的就是一个函数,因此当找不到name对应的函数后就调用default函数。

setattr(object,name,value)

object存在name属性时,则通过value覆盖之前name属性object不存在name属性时,则新增属性name依然时字符串类型,value可以是一个数值,也可以是一个函数

hasattr(object,name)

判断对象是否有这个名字的属性,name必须为字符串

反射相关的魔术方法

getattr()、setattr()、delattr()这三个魔术方法,分别测试。

getattr()

class Base:        n = 0class Point(Base):        z = 6        def __init__(self,x,y):                self.x = x                self.y = y        def show(self):                print(self.x,self.y)        def __getattr__(self,item):                return "missing{}".format(item)p1 = Point(4,5)print(p1.x)print(p1.z)print(p1.n)print(p1.t)

一个类的属性会按照继承关系找,如果找不到,就会执行getattr()方法,如果没有这个方法,就会抛出AttributeError异常表示找不到属性

查找属性顺序为:
instance.dict --> instance.class.dict --> 继承的祖先类(直到object)的dict --找不到--> 调用getattr()

setattr()

实例通过.点设置属性,如同self.x = x,就会调用setattr(),属性要加到实例的dict中,就需要自己完成。

class Base:        n = 0class Point(Base):        z = 6        def __init__(self,x,y):                self.x = x                self.y = y        def show(self):                print(self.x,self.y)        def __getattr__(self,item):                return "missing{}".format(item)        def __setattr__(self, key, value):                print("setattr {}={}".format(key,value))                #self.__dict__[key] = value #正常情况下设置属性                #return self #返回实例本身p1 = Point(4,5)print(p1.__dict__)print(p1.x)print(p1.z)print(p1.n)print(p1.t)p1.name = 50p1.x = 50print(p1.name)print(p1.x)p1.__dict__["x"] = 60print(p1.__dict__)

delattr()

可以通过此实例删除属性的操作,但是通过类依然可以删除属性

class Base:        n = 0class Point(Base):        Z = 5def __init__(self,x,y):    self.x = x    self.y = ydef __delattr__(self,item):    print("Can not del{}".format(item))p = Point(4,5)del p.xprint(p.dict)p.z = 15print(p.dict)del p.zdel p.zprint(Point.dict)print(p.dict)print(Point.Z)del Point.Zprint(Point.dict)print(Point.Z)

转载于:https://blog.51cto.com/13886193/2275413

你可能感兴趣的文章
Tomcat 生产服务器性能优化
查看>>
再荐《高效能人士的七个习惯》
查看>>
Android中Context简介
查看>>
Beetle简单构建TCP服务
查看>>
CRS-4258: Addition and deletion of voting files are not allowed because the voting files are on ASM
查看>>
数据库的开发笔记-字典表
查看>>
[Step By Step]SAP HANA创建属性视图(Attribute View)
查看>>
geoserver扫盲 openlayers相关(转载)
查看>>
poj 2112(二分+多重匹配)
查看>>
MSSQL 2008错误提示:更改对于登录sa失败
查看>>
外媒分析未来科技五大趋势 网络安全获关注
查看>>
Transact-SQL小知识
查看>>
C# winform 使用DsoFramer 创建 显示office 文档
查看>>
C#邮件接收系统核心代码(接收POP3邮件IMAP邮件)
查看>>
[MySQL] MySQL的自己主动化安装部署
查看>>
java 堆栈分析3
查看>>
[已招满,谢谢关注]Sogou招聘C#开发人员,有意者请进
查看>>
典型相关分析相关资料
查看>>
项目重构之数据源配置与优化:log4j 配置数据库连接池Druid,并实现日志存储到数据库...
查看>>
Android 图板之保存图像
查看>>