Python面对对象类的反射机制是面向对象编程语言中比较重要的功能,可以动态获取对象信息以及动态调用对象。通过字符串形式的类名或属性来访问对应类或属性。
一、对象的反射
1. getattr 获取指定字符串名称的对象属性、方法: 当访问的属性不存在时,会报错!
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def 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')()
break
else:
error_msg = '用户名不存在,请重新输入!'
print(error_msg)
lst.append(error_msg)
if len(lst) >= 5:
print('输入错误的用户名已经超过当日的上限,请申请相关解除手续')
break
关于类的其他高级应用,下一期
将继续分享。