反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
如下可以用hasattr判断是否含有叫做“abc”的属性,若有便会执行,反之则不会
class Person():
def __init__(self ,name ,age):
self.name = name
self.age = age
p = Person("Alex" ,22)
if hasattr(p,"abc"):#映射
print("...")
反射四种方法:
getattr() ——get
hasattr() ——判断
setattr() ——赋值
delattr() ——删除
例子:
class Person():
def __init__(self ,name ,age):
self.name = name
self.age = age
def walk(self):
print("walking....")
def talk(self):
print(self.name ,"is speaking.....")
p = Person("Alex" ,22)
if hasattr(p,"name"): # 映射
print("l.......")
hasattr() ——判断
user_command = input(">>:").strip()
if hasattr(p,user_command):
func = getattr(p,user_command)
func()
getattr() ——get
a = getattr(p,"age")
print(a)
setattr() ——赋值
## static 属性
setattr(p,"sex","Female")
print(p.sex)
## 方法
setattr(p,"speak",talk)
p.speak(p)
setattr(Person,"speak2",talk)#对类直接绑定的话,实例调用不用手动传p
p.speak()
delattr() ——删除
delattr(p,"age")#跟del p.age相同
反射的应用
了解了反射的四个函数。那么反射到底有什么用呢?它的应用场景是什么呢?
现在让我们打开浏览器,访问一个网站,你单击登录就跳转到登录界面,你单击注册就跳转到注册界面,等等,其实你单击的其实是一个个的链接,每一个链接都会有一个函数或者方法来处理。
没学反射之前的解决方式
class User:
def login(self):
print('欢迎来到登录页面')
def register(self):
print('欢迎来到注册页面')
def save(self):
print('欢迎来到存储页面')
while 1:
choose = input('>>>').strip()
if choose == 'login':
obj = User()
obj.login()
elif choose == 'register':
obj = User()
obj.register()
elif choose == 'save':
obj = User()
obj.save()
学了反射之后解决方式
class User:
def login(self):
print('欢迎来到登录页面')
def register(self):
print('欢迎来到注册页面')
def save(self):
print('欢迎来到存储页面')
user = User()
while 1:
choose = input('>>>').strip()
if hasattr(user,choose):
func = getattr(user,choose)
func()
else:
print('输入错误。。。。')
对于__name__补充
print(__name__) # __main__ 就代表模块本身, self.
if __name__ == "__main__": #只会在被别的模块导入的时候发挥作用
print("hahahah")
#print('hahaha')
name 在当前模块主动执行的情况下(不是被导入执行),等于__main__
在被其他模块导入执行的情况下,模块名