Python进阶学习(5)反射

反射

在 Python 中,反射是指通过字符串形式的对象属性名称来访问、调用或修改对象的属性和方法的能力。Python 中的对象是动态的,可以在运行时根据需要添加、删除或修改属性和方法。反射提供了一种灵活的方式来操作对象的属性和方法,而不需要提前知道这些属性和方法的名称。

Python 提供了以下内置函数来实现反射操作:

  1. getattr(obj, name[, default]): 获取对象 obj 的属性 name 的值。如果属性不存在,可以提供一个默认值 default
  2. setattr(obj, name, value): 设置对象 obj 的属性 name 的值为 value
  3. hasattr(obj, name): 检查对象 obj 是否有属性 name
  4. delattr(obj, name): 删除对象 obj 的属性 name

通过这些函数,您可以在运行时动态地访问和修改对象的属性和方法,从而实现反射的功能。反射在某些情况下非常有用,例如在编写通用代码、插件系统或动态配置时。但需要注意,过度使用反射可能会使代码变得难以理解和维护,因此应谨慎使用。

1.getattr关键词

getattr 获取指定对象属性以及方法
格式:
变量名 = getattr(对象, “对象属性”, 默认值 )

class People:
    def __init__(self, name, hair):
        self.name = name
        self.hair = hair


    def peopleInfo(self):
        print(f"这位同学名字为{self.name}, 头发为{self.hair}")


stu1 = People("好运不段", "地中海+白色")
# 查看这个对象有没有name这个属性
n = getattr(stu1, "name", True)
# 输出name的数值
print(n)

# 如果匹配不到,如果默认值有设定,那么就会输出默认值,如果没有设定会报错
n = getattr(stu1, "age", False)
print(n)

2.setattr关键词

1.setattr 设置对象属性
格式:
setattr(对象,‘对象属性’, 数值)

设置对象属性值

class People:
    def __init__(self, name, hair):
        self.name = name
        self.hair = hair

    def peopleInfo(self):
        print(f"这位同学名字为{self.name}, 头发为{self.hair}")


stu1 = People("好运不段", "地中海+白色")


# 可以修改数值
setattr(stu1, "hair", "黑长直")
print(stu1.__dict__)

# 如果没有该数值直接添加
setattr(stu1, "__age", 18)
print(stu1.__dict__)

# 也可以通过getattr获取私有属性
print(getattr(stu1, "__age", False))

3.hasattr关键字

hasattr 判断对象是否有对应的的属性以及方法

就是看这个对象有没有属性或者方法
格式
hasattr(对象,‘对象属性’)

class People:
    def __init__(self, name, hair):
        self.name = name
        self.hair = hair

    def peopleInfo(self):
        print(f"这位同学名字为{self.name}, 头发为{self.hair}")


stu1 = People("好运不段", "地中海+白色")

print(hasattr(stu1, "age"))



4.delattr关键字

delattr 删除对象属性
delattr (对象,“对象属性”)

class People:
    def __init__(self, name, hair):
        self.name = name
        self.hair = hair

    def peopleInfo(self):
        print(f"这位同学名字为{self.name}, 头发为{self.hair}")


stu1 = People("好运不段", "地中海+白色")

delattr(stu1, "name")
print(stu1.__dict__)

# 当删除的属性不存在就会报错
print(delattr(stu1, "name"))

5.反射的使用

class Shop:
    def register(self):
        print("注册功能")

    def login(self):
        print("登录功能")

    def shopping(self):
        print("购物商城")


shop1 = Shop()

select = input("请输入你要操作的功能")

if hasattr(shop1, select):
    # getattr 格式: getattr(对象, "方法名") => 方法名
    getattr(shop1, select)()

else:
    print("输入有误")

6.好处

反射在 Python 中具有多种作用,主要包括以下几个方面:

  1. 动态调用方法和访问属性:通过反射,可以在运行时根据字符串形式的属性名或方法名来动态地调用对象的方法或访问属性,从而实现灵活的对象操作。

  2. 实现通用代码:反射可以帮助编写通用的代码,因为它允许在不知道对象结构的情况下操作对象的属性和方法,从而实现更通用的函数或类。

  3. 插件系统:反射可以用于实现插件系统,允许动态加载并调用不同的插件,而无需硬编码每个插件的具体实现。

  4. 配置和元编程:通过反射,可以动态地配置对象的属性和方法,或者在运行时生成代码,实现元编程的功能。

  5. 调试和测试:在调试和测试过程中,反射可以帮助查看和修改对象的内部状态,以及动态地调用方法,有助于快速定位和解决问题。

总的来说,反射为 Python 提供了一种灵活的方式来操作对象,使得代码更加动态和通用。然而,需要注意反射可能会降低代码的可读性和性能,因此在使用时需要权衡利弊,避免滥用。

  • 29
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只特立独行猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值