简单理解:
自省相当于只读,反射相当于能读能写(改)
自省
自省常用到函数 dir()
dir() 函数可能是 Python 自省机制中最著名的部分了。
它返回传递给它的任何对象的属性,方法等,并且生成一个列表, 并且这个列表是经过排序的。
如果不指定对象,则 dir()返回当前作用域中的名称。
dir() 函数适用于所有对象类型,包括字符串、整数、列表、元组、字典、函数、定制类、类实例和类方法。
可以试用以下代码来了解
dir(18)
dir('shark')
dir([])
dir(())
dir({})
dir(id)
dir 作用于类和实例对象
lass Person:
city='bj'
def __init__(self,name,age):
self.name = name
self.age = age
def foo(self):
return f"{self.name}"
obj=Person('shark',18)
print(dir(obj))
obj.hobby = 'money'
#dir()返回传递给它的任何对象的属性名称列表, 并且这个列表是经过排序的。
print(dir(obj))
反射
在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。 ---- 摘自维基百科
要注意术语“反射”和“内省”(type introspection)的关系。内省(或称“自省”)机制仅指程序在运行时对自身信息(称为元数据)的检测;反射机制不仅包括要能在运行时对程序自身信息进行检测,还要求程序能进一步根据这些信息改变程序状态或结构。 ---- 摘自维基百科
Python 拥有反射机制。
简单的来说,就是利用字符串的形式操作 对象 的相关属性或方法。
Python 拥有反射机制, 就是可以使用字符串操作对象的属性。
这个对象包括:
类对象
类的实例对象
模块
在 Python 中就有下面一组内置的函数来实现反射。
hasattr() 判断一个对象中是否有某个属性
getattr() 获取一个对象中的已有的某个属性
setattr() 添加某个属性给一个对象
delattr() 删除一个对象已有的某个属性
上面几个函数的语法:
hasattr(对象, "对象的属性名称")
注意 对象的属性名称 是字符串
代码实例
class Person:
city='bj'
def __init__(self,name,age):
self.name = name
self.age = age
def foo(self):
return f"{self.name}"
obj=Person('shark',18)
print(hasattr(Person,'city'))
print(getattr(Person,'city'))
f=getattr(obj,'foo') 获取对象的函数并且调用他
print(f())
setattr(obj,'name','xiguatian') 替对象改属性
print(getattr(obj,'name'))
delattr(obj,'name') 将对象的属性删除
print(getattr(obj,'name','no')) 如果获取不到相应的值会报错,所以加
一个默认值 'no'
setattr(obj,'name','wgy') 添加属性并且赋值
print(obj.foo())
print(getattr(obj,'age','name')) getatter取不到两个值
网友评论