• 面向对象-反射


    反射

    python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

    1.反射的4种用法:

    1. 判断object中有没有一个name字符串对应的方法或属性(hasattr)
    2. 对属性的增加修改的方法(setattr)
    3. 对属性的删除方法(delattr)
    4. 对属性的查询方法(getattr)

    1.判断object中有没有一个name字符串对应的方法或属性(hasattr)

    class Foo:
        x = 10
        def __init__(self,name):
            self.name = name
    
        def say_info(self):
            print("say hello %s" % self.name)
    
    f = Foo("xiaoming")
    print(f.__dict__["name"])
    print(hasattr(f,"name"))
    
    # 也可以获取 类中的其他属性是否存在;
    print(hasattr(f,"say_info"))
    print(hasattr(f,"x"))
    

    输出:

    xiaoming
    True
    True
    True
    

    2.对属性的增加修改的方法(setattr)

    class Foo:
        x = 10
        def __init__(self,name):
            self.name = name
    
        def say_info(self):
            print("say hello %s" % self.name)
    
    f = Foo("xiaoming")
    
    print(f.__dict__)
    setattr(f,"age",18)
    print(f.__dict__)
    

    输出:

    {'name': 'xiaoming'}
    {'age': 18, 'name': 'xiaoming'}
    

    3.对属性的查询方法(getattr)

    class Foo:
        x = 10
        def __init__(self,name):
            self.name = name
    
        def say_info(self):
            print("say hello %s" % self.name)
    
    f = Foo("xiaoming")
    
    # 对数据进行获取,如果有就返回获取的值,没有可以设置第三值或None
    print(getattr(f,"name",None))
    print(getattr(f,"abcd",None))
    

    输出:

    xiaoming
    None
    

    4.对属性的删除方法(delattr)

    class Foo:
        x = 10
        def __init__(self,name):
            self.name = name
    
        def say_info(self):
            print("say hello %s" % self.name)
    
    f = Foo("xiaoming")
    setattr(f,"age",18)
    
    print(f.__dict__)
    # 删除name这个属性方法
    delattr(f,"name")
    print(f.__dict__)
    

    输出:

    {'name': 'xiaoming', 'age': 18}
    # 删除后只剩下age
    {'age': 18}
    

    2.将用户输入的命令,通过反射的方法映射到相应的函数方法上:

    1 . 通过反射,用户输入的内容来执行相应的方法

    class FtpServer:
        def __init__(self,host,port):
            self.host = host
            self.port = port
    
        def run(self):
            while True:
                cmd = input(">>>:").strip()
                if not cmd:continue
                # 注释方法也行
                # getcmd = getattr(self,cmd,None)
                # if not getcmd:continue
                # getcmd()
                if hasattr(self,cmd):
                    func = getattr(self,cmd)
                    func()
    
        def get(self):
            print("this get!")
    
        def put(self):
            print("this put!!")
    f = FtpServer("192.168.1.1","21")
    f.run()
    

    输出:

    >>>:get
    this get!
    >>>:put
    this put!!
    
  • 相关阅读:
    cordova 日曆 聯系人 插件使用
    ionic 不同view的數據交互
    JQuery iframe 刷新效果
    fis学习
    如何用nfs命令烧写内核和文件系统(网络下载文件到nandflash)(未完)
    布线的基本原则
    电平转转换电路
    焊盘的制作
    flash-热风焊盘的制作
    焊盘的层面剖析
  • 原文地址:https://www.cnblogs.com/baolin2200/p/7407122.html
Copyright © 2020-2023  润新知