前言:
当前你们对“python里面的self”都比较注重,咱们都想要了解一些“python里面的self”的相关文章。那么小编也在网上汇集了一些对于“python里面的self””的相关资讯,希望兄弟们能喜欢,我们快快来学习一下吧!什么是反射?
第一次听到这个概念的你,会不会和当初的我一样,以为这是一个什么奇怪的理论。还以为和膝跳反射一样的一个概念。后来才知道,我想简单了。哈哈。
官方解释主要是指程序可以访问、检查和修改它本身状态或行为的一种能力。
翻译成我们好理解的就是,Python里面有一个重要的概念就是反射,反射就是把类中的方法用字符串映射的方式去执行和调用。通常我们在使用类的时候,主要就是为了封装一个个模块,里面存放着各种不同的代码块,也就是方法。
反射的引子
为啥要学会反射呢?因为反射会让我们的调用变得简单,让我们的代码不再low。
举个例子瞧一瞧。
#!/usr/bin/env pythonclass ShopHigh: def register(self): print("-------------login page----------") def login(self): print("-------------login page----------") def homepage(self): print("-------------home page----------")if __name__ == '__main__': while True: choose = input(">>user choose:").strip() if choose == "register": s = ShopHigh() s.register() elif choose == "login": s = ShopHigh() s.login() elif choose == "homepage": s = ShopHigh() s.homepage()
此时如果用户有更多的方法就需要更多的if条件判断来执行某一个特定的方法。实在话太麻烦了。接下来我们会见证反射的神奇妙用。
反射的四个方法getattr 获取指定字符串名称的对象属性setattr 为对象设置一个对象hasattr 判断对象是否有对应的对象delattr 删除指定对象
这样说可能很抽象,我们还是以例子来说明。
当我们在调用别人定义的类的时候,我们如何来确定我们使用的方法有哪些属性,有哪些属性可以修改呢?以上的四个方法就可以很好地实现获取这个结果。
class Person: def __init__(self, name, sex): self.name = name self.sex = sex def think(self): print("思考中.........")p = Person("Jack","M")#--------------------------其他人调用这个类时--------------------if hasattr(p, "score"): print("有score属性....")name = getattr(p, "name")print(name)cmd = input(">>用户输入的指令:").strip()if hasattr(p, cmd): func = getattr(p, cmd) func()
那么setattr怎么用呢?
class Person: def __init__(self, name, sex): self.name = name self.sex = sex def think(self): print("思考中.........")p = Person("Jack","M")#--------------------------其他人调用这个类时--------------------#增加实例的属性setattr(p, "score", 90)print(p.score)#动态的增加类方法1def study(): print("studying..")setattr(p, "study",study)p.study()#动态的增加类方法2def talk(self): print("%s is talking...." % self.name)setattr(Person, "talk", talk)p.talk()
delattr使用
反射应用
下来我们回答一下文章开头的那个问题,优化的解决方案如下。
class ShopHigh: def register(self): print("-------------login page----------") def login(self): print("-------------login page----------") def homepage(self): print("-------------home page----------")if __name__ == '__main__': s = ShopHigh() while True: choose = input(">>user choose:").strip() if hasattr(s, choose): func = getattr(s, choose) func()
执行结果
"C:\Program Files\Python38\python3.exe" D:/python/python_210710/exercise_03/reflect.py
>>user choose:login
-------------login page----------
>>user choose:homepage
-------------home page----------
>>user choose:
。。。。
这样一来是不是方便了很多呢。
标签: #python里面的self