Python面对对象类的反射机制是面向对象编程语言中比较重要的功能,可以动态获取对象信息以及动态调用对象。通过字符串形式的类名或属性来访问对应类或属性。
一、对象的反射
1. getattr 获取指定字符串名称的对象属性、方法: 当访问的属性不存在时,会报错!
class Person:def __init__(self, name, age):self.name = nameself.age = agedef say_hello(self):return (f'Hello,{self.name}')person = Person('冯大少',18)name = getattr(person, 'name')
print(name)
age = getattr(person, 'age')
print(age)
func = getattr(person, 'say_hello')()
print(func)
print(getattr(person, 'test'))
加第3个参数,当访问的属性不存在时,返回指定的内容
2、hasattr 判断对象是否有对应的对象属性、方法,返回 bool 值
3、setattr 为对象设置一个对象属性 : 可以通过匿名函数调用 name 属性
4. delattr 删除指定属性:
最后用一个登录验证的例子,再看看类的反射怎样实现校验:
通过 hasattr(userverify, username) 去校验 输入的内容,当输入5次都是错误,就触发结束循环前的语句。
当校验成功时,调用 login_message 方法,结束循环。
lst = []class UserVerify:def __init__(self, ):self.username1 = '冯大少1'self.username2 = '冯大少2'self.username3 = '冯大少3'self.username4 = '冯大少4'self.username5 = '冯大少5'def login_message(self):print(f'登录成功,欢迎{self.username1}访问')while True:userverify = UserVerify()username = input('请输入用户名')if hasattr(userverify, username):func = getattr(userverify, 'login_message')()breakelse:error_msg = '用户名不存在,请重新输入!'print(error_msg)lst.append(error_msg)if len(lst) >= 5:print('输入错误的用户名已经超过当日的上限,请申请相关解除手续')break
关于类的其他高级应用,下一期
将继续分享。