反射

反射

反射机制:在程序运行过程中,动态的获取对象信息,以及动态获取对象属性/方法的功能

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()
​
 
posted @ 2022-10-21 09:21  无敌大牛牛  阅读(13)  评论(0编辑  收藏  举报