龙空技术网

python课堂||神奇的反射

l想去有风的地方 234

前言:

当前你们对“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