反射
在 Python 中,反射是指通过字符串形式的对象属性名称来访问、调用或修改对象的属性和方法的能力。Python 中的对象是动态的,可以在运行时根据需要添加、删除或修改属性和方法。反射提供了一种灵活的方式来操作对象的属性和方法,而不需要提前知道这些属性和方法的名称。
Python 提供了以下内置函数来实现反射操作:
getattr(obj, name[, default])
: 获取对象obj
的属性name
的值。如果属性不存在,可以提供一个默认值default
。setattr(obj, name, value)
: 设置对象obj
的属性name
的值为value
。hasattr(obj, name)
: 检查对象obj
是否有属性name
。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 中具有多种作用,主要包括以下几个方面:
-
动态调用方法和访问属性:通过反射,可以在运行时根据字符串形式的属性名或方法名来动态地调用对象的方法或访问属性,从而实现灵活的对象操作。
-
实现通用代码:反射可以帮助编写通用的代码,因为它允许在不知道对象结构的情况下操作对象的属性和方法,从而实现更通用的函数或类。
-
插件系统:反射可以用于实现插件系统,允许动态加载并调用不同的插件,而无需硬编码每个插件的具体实现。
-
配置和元编程:通过反射,可以动态地配置对象的属性和方法,或者在运行时生成代码,实现元编程的功能。
-
调试和测试:在调试和测试过程中,反射可以帮助查看和修改对象的内部状态,以及动态地调用方法,有助于快速定位和解决问题。
总的来说,反射为 Python 提供了一种灵活的方式来操作对象,使得代码更加动态和通用。然而,需要注意反射可能会降低代码的可读性和性能,因此在使用时需要权衡利弊,避免滥用。