反射
反射机制:在程序运行过程中,动态的获取对象信息,以及动态获取对象属性/方法的功能
dir() 查看对象已有的属性,返回的列表里面都是字符串类型
因为obj点的是属性,不是字符串,所以要通过字符串,反射到真正的对象属性上
内置函数
dir() 和__dict__
# dir() 查看对象已有的属性,返回的列表里面都是字符串类型
# 为什么不用__dict__去查看每个对象的属性,因为有的对象是没有__dict__的,比如num = 10这个对象就没有__dict__的属性,所以,可以通过dir()内置函数去查看对象已有的属性
class Cat:
pass
print(dir(Cat))
# ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '
getattr()
gerattr(obj,"name") 等价于 obj.name
class A:
def __init__(self,name):
self.name = name
a = A()
a.name
getattr(a,name) # 从a对象中获取name属性,等价于a.name
# 如果指定了默认参数,则在属性未指定时返回该参数
print(getattr(a, "bb","获取不到属性给的默认值"))
getattr(a,"bb",None) # 默认值要显式的定义出来,若不定义,则会报异常获取不到这个属性:AttributeError: 'A' object has no attribute 'bb'
getattr()/setattr()/hasattr()/delattr()
class Cat:
pass
if hasattr(Cat,"age"): # 有这个属性返回True,没有这个属性返回False。
pass
else:
print("Cat对象没有age属性")
内置函数分别对应魔术方法
当调用
getattr()
触发的是__getattriute__
当调用
setattr()
触发的是__setattr__
"""
obj.__getattr__
当查找对象属性,没有查找到的时候调用该方法
obj.__getattriute__
查找对象属性时,调用该方法
obj.__setattr__
设置对象属性时候,调用该方法设置属性
obj.__delattr__
在del 删除对象属性时,触发此方法,删除类属性不会触发此方法
"""
通常是 先用
hasattr()判断这个对象有没有这个属性
,若是有就去用getattr()
去获取
getattr(obj,"这里传的属性名称是字符串格式")
实际开发中,不确定传过来对象,有没有这个属性
class A:
def func(self):
pass
a = A()
if hasattr(a,"func"):
res = getattr(a,"func")
res()