• python学习DAY10(反射)


    反射:通过字符串映射或修改程序运行的状态、属性、方法
    #---
    hasattr(obj,str):判断对象里是否有对应的字符串的方法,返回True或False:第一个参数是对象名,第二个参数是需要查找的字符串的方法
    getattr(obj,str):根据字符串调用对象里字符串对应的方法,返回的是该方法的内存地址:第一个参数是对象名,第二个参数是需要调用的属性或方法
    setattr(obj,str,func):为类设置新方法:第一个参数是对象名,第二个参数是字符串,第三个参数是新的方法名或新的属性值。对象调用的时候是以str的字符串为方法名调用
    delattr(obj,str):删除字符串对应的属性或方法:第一个参数是对象名,第二个参数是字符串
    #---
    #注意!每次新添加的属性或方法,如果需要调用,则必须用一个新的变量名去接收getattr(obj,str)返回的结果,再去进行相应的操作,类似于t.choice是不可行的,必须要用到getattr(obj,str)
    class Test(self):
        def __init__(self,name):
            self.name=name
        def test(self):
            print("%s is test"%self.name)
    
    t=Test("lbc")
    choice=input(">>:").strip()
    #反射
    #输入字符串动态匹配类中的方法
    #hasattr:判断对象里是否有对应的字符串的方法,返回True或False
    print(hasattr(t,choice))  
    
    #如果hasattr返回True,进行动态调用
    #getattr:根据字符串调用对象里字符串对应的方法,返回的是该方法的内存地址
    getattr(t,choice)          
    getattr(t,choice)()       #没加括号是返回内存地址,加上括号即调用
    
    #---自定义函数添加到类中
    def newone(self):
        print("this is newone")
    #---
    
    #------流程小结
    if hasattr(t,choice):
        func=getattr(t,choice)    #赋值给一个变量的目的是方便可以传参
        func()  
    else:
        #传方法
        setattr(t,choice,newone) #将newone方法传进类中
        #假设输入的choice是talk
        t.talk(t)               #注意传进对象本身(也可以可以采用getattr方法)
        #传属性
        setattr(t,choice,22)
        getattr(t,choice)       #返回22
    #------
    
    #---修改字符串对应的属性
    if hasattr(t,choice):
        attr=getattr(t,choice)
        setattr(t,choice,"aaa") #"lbc" ---> "aaa"
       #如果存在,删除choice对应的方法或属性
        delattr(t,choice)
  • 相关阅读:
    springmvc视图解析
    mysql外键是多个id组成的字符串,查询方法
    mysql服务无法启动(1067错误)时数据备份的经验
    springboot(5) freemarker
    springboot(4) Log之Logbak
    springboot(3) junit单元测试
    集合类基础知识
    springboot(2) 数据库操作
    springboot(1)
    linux命令
  • 原文地址:https://www.cnblogs.com/god-for-speed/p/11362438.html
Copyright © 2020-2023  润新知