zoukankan      html  css  js  c++  java
  • 10反射


    #反射:通过字符串映射到对象的属性
    class Peple:
    def __init__(self,name,age):
    self.name=name
    self.age=age

    def talk(self):
    print('%s in talking' %self.name)

    obj=Peple('egon',18)
    # print(obj.name) #本质 obj.__dict__['name']
    # print(obj.talk)

    # print(Peple.__dict__) #类的名称空间
    # choice=input(">>: ") #input所有输入都是一个str choice=str
    # print(obj.choice) #这里调用obj的是一个方法 ,所以这样调用时不行的


    #查存不存在
    # print(hasattr(obj,'name')) #obj.__dict__['name']
    # print(hasattr(obj,'talk')) #obj.talk

    #取到查询的值
    # print(getattr(obj,'name',None))
    # print(getattr(obj,'talk',None))

    #增加属性
    # setattr(obj,'sex','male')
    # print(obj.sex)

    #删除属性
    # delattr(obj,'age')
    # print(obj.__dict__)

    #反射的应用
    class Service:
    def run(self):
    while True:
    cmd=input('>>: ').strip()
    if hasattr(self,cmd): #判断输入的字符串是否存在,存在就掉用
    func=getattr(self,cmd)
    func()


    def get(self):
    print('get......')

    def put(self):
    print('put......')


    obj=Service()
    obj.run()


    总之反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,
    这其实是一种‘后期绑定’,什么意思?即你可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能


    好处一:实现可插拔机制

    有俩程序员,一个lili,一个是egon,lili在写程序的时候需要用到egon所写的类,但是egon去跟女朋友度蜜月去了,

    还没有完成他写的类,lili想到了反射,使用了反射机制lili可以继续完成自己的代码,

    等egon度蜜月回来后再继续完成类的定义并且去实现lili想要的功能。

    egon还没有实现全部功能

    class FtpClient:
        'ftp客户端,但是还么有实现具体的功能'
        def __init__(self,addr):
            print('正在连接服务器[%s]' %addr)
            self.addr=addr
    

    不影响lili的代码编写

    #from module import FtpClient
    f1=FtpClient('192.168.1.1')
    if hasattr(f1,'get'):
        func_get=getattr(f1,'get')
        func_get()
    else:
        print('---->不存在此方法')
        print('处理其他的逻辑')
  • 相关阅读:
    Android中设置APP应用字体不缩放,文字不随系统字体大小变化
    day02 作业
    day01
    2018.11.2
    2018.11.1
    2018.10.25
    2018.10.24
    2018.10.23
    2018.10.20
    2018.10.19学习总结
  • 原文地址:https://www.cnblogs.com/sunny666/p/9661733.html
Copyright © 2011-2022 走看看