代码拉取完成,页面将自动刷新
运行时,区别于翻译时,指的是程序被加载到内存中执行的时候。 反射,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__)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。