前言
Python系列文章主要是记录自己学习成果及知识输出整合,提供一个温故而知新的场所。
一、反射
1、什么是反射?
把字符串映射到实例的变量或实例的方法(只通过字符串调用类中的变量或方法)
反射的本质(核心):利用字符串的形式去操作对象/模块中成员(方法/对象)
基于字符串的事件驱动
2、反射四个重要的方法
getattr 获取对象属性/对象方法
hasattr 判断对象是否有对应的属性和方法
delattr 删除指定的属性
setattr 为对象设置内容
"""闭包函数表现形式1 内部函数的局部变量可以在外部访问"""
class Testobj:
def __init__(self, name, age):
self.name = name
self.age = age
def fun1(self):
print('执行fun1方法')
def fun2():
print('类的外部方法')
if __name__ == '__main__':
"""1、getattr 获取对象属性/对象方法"""
xiao = Testobj('xiaom', 20)
# 获取对象的属性
print(getattr(xiao, 'name'))
# 执行对象的方法
result = getattr(xiao, 'fun1')
result()
"""2、hasattr 判断对象是否有对应的属性和方法"""
if hasattr(xiao, 'adderss'):
print(getattr(xiao, 'adderss'))
if hasattr(xiao, 'fun1'):
print(getattr(xiao, 'fun1'))
"""3、delattr 删除指定的属性"""
if hasattr(xiao, 'adderss'):
print(delattr(xiao, 'adderss'))
if hasattr(xiao, 'fun1'):
print(delattr(xiao, 'fun1'))
"""4、setattr 为对象设置内容"""
# 修改属性
setattr(xiao, 'name', 'winner')
print(getattr(xiao, 'name'))
# 修改方法(fun3为新名称,fun1为老名称)相当于增加了一个方法到类里面,可以用实例对象进行引用
setattr(xiao, 'fun3', fun2)
getattr(xiao, 'fun3')()
# 使用实例对象引用 外部方法
xiao.fun3()
示例
"""
实现某个业务,定义类,类里面封装很多方法,提供一个统一的入口能够调用各种方法
业务:登录 退出 注销 注册
"""
class Demo:
def login(self):
print('这是登录')
def exit(self):
print('这是退出')
def logout(self):
print('这是注销')
def regist(self):
print('这是注册')
# 提供一个run函数(一个统一的入口),通过以字符串的形式传入参数(函数名),就可的访问所有方法
def run(self, i):
getattr(self, i)()
Demo().run('exit')
总结
以上就是文章要表达的内容,本文介绍了Python如何利用反射来建立函数机制。