• python中的hasattr()、getattr()、setattr()


    hasattr()的用法和理解--hasattr(obj, target)

    判断对象obj中是否含有,目标target属性,然后返回布尔值,如果有返回True,没有返回False。

    >>> class School:
    ...     def __init__(self):
    ...         self.teacher_name = self.teacher
    ...     def teacher(self): 
    ...         return input("输入姓名:")
    ... 
    >>> s1 = School()                   #实例化一个学校对象
    >>> hasattr(s1, "teacher")      #查看s对象中是否有teacher属性(方法)
    True                                      #有该属性返回True
    >>> hasattr(s1, "student")
    False                                    #s对象中没有student属性,返回False
    >>> 
    
    getattr()的用法--getattr(obj, target)

    使用getattr()函数,可以将对象obj中的属性、方法获取出来

    >>> class School:
    ...     def __init__(self):
    ...         self.teacher_name = self.teacher
    ...     def teacher(self): 
    ...         return input("输入姓名:")
    ... 
    >>> s2 = School()
    >>> func = getattr(s2, "teacher")  #获取s2实例当中的teacher函数,并将其赋值给func
    >>> print(func())                        #在这儿调用func函数,等于调用teacher函数
    输入姓名: lina
    'lina'
    >>> 
    >>> getattr(s2, "student")              #尝试获取一个对象中不存在的方法
    Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
    AttributeError: 'School' object has no attribute 'student'                  
     #发生了属性声明错误,该对象中没有想要获得的属性
    #当然为了避免出错,可以设置一个默认值
    >>> getattr(s2, "student", "AttributeError")
    'AttributeError'
    >>> 
    
    setattr()给对象的属性赋值,如果该属性不存在,那就先创建在赋值--setattr(obj, name, value)

    看到这儿我想都能应该明白怎么用了,上一个例子中,最后我们尝试获取一个不存在的属性发生错误,如果我们先用setattr()方法,那么就可先向对象中创建该属性、方法

    >>> class School:
    ...     def __init__(self):
    ...         self.teacher_name = self.teacher
    ...     def teacher(self): 
    ...         return input("输入姓名:")
    ... 
    >>> 
    >>> def student():
    ...     return input("学生姓名:")
    ... 
    >>> setattr(School, "student", student)  #直接往School类当中设置名字为"student"的方法student也是可以的,
    >>>School.student()      #现在在School类当中直接调用student()方法就不会报错了
    学生姓名:luna
    'luna'
    >>> s3 = School()
    >>> s3.__setattr__("stu", student)  #类中的隐藏函数__setattr__(name, value) 也可以完成设置属性、方法
    >>> s3.stu()
    学生姓名:Amber
    'Amber'
    >>>
    
    hasattr()、getattr()思考拓展

    很多时候我们面对一个未知的程序,未知的类。也不能去瞎改别人的代码,而这两个函数就可以帮助我们测试,加上setattr()就可以直接打补丁,来修改以达到我们目的。
    而hasattr()和getattr()更为重要的应用当然还是,关系映射。
    都知道类与类之间或者与函数、对象之间,相联系的方式有继承、派生和类的组合。而这些方式都需要直接联系。
    而hasattr()、和getattr() 就可以帮助我们达到 A.a -------> B.b 将两个毫不相干的对象建立关系映射。甚至随便建立多级映射,C <------- A -----> B 而不影响映射的函数或者类。
    如现在我们写一个可以完成和用户交互,实现上传、下载、查看目录的类,具体业务逻辑函数就不赘写了!主要看使用hanattr()和getattr()交互、调用逻辑函数

    import socket
    
    class UploadDownload:
        """
            这是一个具有连上远程服务器,发送命令实现上传下载功能的类
            _connect() 链接远程服务器
        """
    
        def __init__(self, IP, PORT):
            self.ip = IP
            self.port = PORT
            self.sock = self._connect()                                                              #调用_connect()函数链接远程服务器
            self.commands = ["upload", "download", "directory"]
    
        def _connect(self):
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((self.ip, self.port))
            return s
    
        def _command(self):
            while True:
                print("Enter cmd like this : upload /home/user/lina/dance.mp4")     #提示输入格式
                cmd = input("Enter cmd :").strip()                                                    #输入指定命令格式,并去除空格
                if not cmd:
                    continue
                else:
                    cmds = cmd.split('')                                                                  #简单处理,将命令和参数分开                  
                    if cmds[0] in self.commands:                                                     #如果是可执行命令,就尝试查找可执行函数
                        try:
                            if hasattr(self,cmds[0]):                                                       # 在类中查找该命令的逻辑函数
                                 func = getattr(self, cmds[0])                                               #存在就获得该函数,并在下一步传入参数执行
                                 func(cmds[1])
                            else:
                                 print("请输入正确的命令格式")
                                continue
                        except Exception as e:
                            print(e)
    
        def upload(self, dir):
            #这个函数用来上传
            pass
    
        def download(self, dir):
            #这个函数用来下载
            pass
    
        def directory(self, dir):
            #此函数查看文件目录
            pass
    
    ud = UploadDownload("localhost",5000)
    ud._command()
    
    人生还有意义。那一定是还在找存在的理由
  • 相关阅读:
    Linux 安装 Redis
    IDEA 安装 VisualVM 插件
    Linux安装Erlang和RabbitMQ
    vue Uncaught Error: Redirected when going from “/*“ to “/*“ 路由报错
    gerrit安装指南
    【.NET技术栈】数据库与Entityframework Core目录
    vue-cli3.0/4.0搭建项目
    安装nodejs并搭建vue项目
    Vue学习之vue-cli脚手架下载安装及配置
    写在强基录取之后
  • 原文地址:https://www.cnblogs.com/shiqi17/p/9280422.html
Copyright © 2020-2023  润新知