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

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

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

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

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

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

  1. >>> class School:
  2. ... def __init__(self):
  3. ... self.teacher_name = self.teacher
  4. ... def teacher(self):
  5. ... return input("输入姓名:")
  6. ...
  7. >>>
  8. >>> def student():
  9. ... return input("学生姓名:")
  10. ...
  11. >>> setattr(School, "student", student) #直接往School类当中设置名字为"student"的方法student也是可以的,
  12. >>>School.student() #现在在School类当中直接调用student()方法就不会报错了
  13. 学生姓名:luna
  14. 'luna'
  15. >>> s3 = School()
  16. >>> s3.__setattr__("stu", student) #类中的隐藏函数__setattr__(name, value) 也可以完成设置属性、方法
  17. >>> s3.stu()
  18. 学生姓名:Amber
  19. 'Amber'
  20. >>>
hasattr()、getattr()思考拓展

很多时候我们面对一个未知的程序,未知的类。也不能去瞎改别人的代码,而这两个函数就可以帮助我们测试,加上setattr()就可以直接打补丁,来修改以达到我们目的。

而hasattr()和getattr()更为重要的应用当然还是,关系映射。

都知道类与类之间或者与函数、对象之间,相联系的方式有继承、派生和类的组合。而这些方式都需要直接联系。

而hasattr()、和getattr() 就可以帮助我们达到 A.a -------> B.b 将两个毫不相干的对象建立关系映射。甚至随便建立多级映射,C <------- A -----> B 而不影响映射的函数或者类。

如现在我们写一个可以完成和用户交互,实现上传、下载、查看目录的类,具体业务逻辑函数就不赘写了!主要看使用hanattr()和getattr()交互、调用逻辑函数

  1. import socket
  2. class UploadDownload:
  3. """
  4. 这是一个具有连上远程服务器,发送命令实现上传下载功能的类
  5. _connect() 链接远程服务器
  6. """
  7. def __init__(self, IP, PORT):
  8. self.ip = IP
  9. self.port = PORT
  10. self.sock = self._connect() #调用_connect()函数链接远程服务器
  11. self.commands = ["upload", "download", "directory"]
  12. def _connect(self):
  13. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  14. s.connect((self.ip, self.port))
  15. return s
  16. def _command(self):
  17. while True:
  18. print("Enter cmd like this : upload /home/user/lina/dance.mp4") #提示输入格式
  19. cmd = input("Enter cmd :").strip() #输入指定命令格式,并去除空格
  20. if not cmd:
  21. continue
  22. else:
  23. cmds = cmd.split('') #简单处理,将命令和参数分开
  24. if cmds[0] in self.commands: #如果是可执行命令,就尝试查找可执行函数
  25. try:
  26. if hasattr(self,cmds[0]): # 在类中查找该命令的逻辑函数
  27. func = getattr(self, cmds[0]) #存在就获得该函数,并在下一步传入参数执行
  28. func(cmds[1])
  29. else:
  30. print("请输入正确的命令格式")
  31. continue
  32. except Exception as e:
  33. print(e)
  34. def upload(self, dir):
  35. #这个函数用来上传
  36. pass
  37. def download(self, dir):
  38. #这个函数用来下载
  39. pass
  40. def directory(self, dir):
  41. #此函数查看文件目录
  42. pass
  43. ud = UploadDownload("localhost",5000)
  44. ud._command()

python中的hasattr()、getattr()、setattr()的更多相关文章

  1. python动态函数hasattr,getattr,setattr,delattr

    hasattr(object,name) hasattr用来判断对象中是否有name属性或者name方法,如果有,染回true,否则返回false class attr():     def fun( ...

  2. python 内置函数的补充 isinstance,issubclass, hasattr ,getattr, setattr, delattr,str,del 用法,以及元类

    isinstance   是 python中的内置函数 , isinstance()用来判断一个函数是不是一个类型 issubclass  是python 中的内置函数,  用来一个类A是不是另外一个 ...

  3. 【转】Python的hasattr() getattr() setattr() 函数使用方法详解

    Python的hasattr() getattr() setattr() 函数使用方法详解 hasattr(object, name)判断一个对象里面是否有name属性或者name方法,返回BOOL值 ...

  4. hasattr() & getattr() & setattr()

    Python的hasattr() getattr() setattr() 函数使用方法详解   感谢作者 ---> 原文链接 hasattr(object, name) 判断一个对象里面是否有n ...

  5. isinstance/type/issubclass的用法,反射(hasattr,getattr,setattr,delattr)

    6.23 自我总结 面向对象的高阶 1.isinstance/type/issubclass 1.type 显示对象的类,但是不会显示他的父类 2.isinstance 会显示的对象的类,也会去找对象 ...

  6. 反射之hasattr() getattr() setattr() 函数

    Python的hasattr() getattr() setattr() 函数使用方法详解 hasattr(object, name)判断object中有没有一个name字符串对应的方法或属性,返回B ...

  7. Python hasattr,getattr,setattr,delattr

    #!/usr/bin/env python # -*- coding:utf-8 -*- # 作者:Presley # 邮箱:1209989516@qq.com # 时间:2018-11-04 # 反 ...

  8. python eval() hasattr() getattr() setattr() 函数使用方法详解

    eval() 函数 --- 将字符串str当成有效的表达式来求值并返回计算结果. 语法:eval(source[, globals[, locals]]) ---> value 参数: sour ...

  9. python反射hasattr getattr setattr delattr

    反射 : 是用字符串类型的名字 去操作 变量 相比于用eval('print(name)') 留有 安全隐患 反射 就没有安全问题 hasattr 语法: hasattr(object, name)o ...

随机推荐

  1. Python 操作 Excel,总有一个模块适合自己

    最近在写性能相关的测试脚本,脚本已经完成,最终怎么体现在报告上,要想让报告看起来漂亮些,我们是先创建一个模板(格式和公式已全部制作好),只需要性能测试完成后往对应的sheet页中填充数据,数据完成后最 ...

  2. 解决MySQL Workbench导出乱码问题

    1.导出数据 2.默认CSV格式 3.乱码 4.解决 文件->另存为,会发现编码为UTF-8,正是MySQL表的编码方式.我们选择编码方式为ANSI,保存类型为所有,覆盖源文件

  3. java web,从零开始,一步一步配置ssm(Spring+SpringMVC+MyBatis)框架

    1.安装JDK: 安装之后要配置环境变量,在系统变量里: 新建变量名JAVA_HOME,变量值C:\Program Files\Java\jdk1.8.0_77: 新建变量名CLASSPATH,变量值 ...

  4. Ros使用Arduino 3用rosserial创建一个subscriber

    在前面的一节中,我们已经使用arduino创建了一个publisher节点,接下来将会用arduino来创建一个subscriber,接收电脑传去的信息并做出相应的反应. 1启动Arduino 将ar ...

  5. Domain Adaptation (1)选题讲解

    1 所选论文 论文题目: <Unsupervised Domain Adaptation with Residual Transfer Networks> 论文信息: NIPS2016, ...

  6. usb-cam(1)安装

    http://www.liuxiao.org/2015/10/ros-%E5%AE%89%E8%A3%85-usb-camera-%E9%A9%B1%E5%8A%A8%E5%B9%B6%E8%B0%8 ...

  7. hibernate validator 动态返回国际化提示

    一.说明 以下方法实现了读取指定国际化文件的校验器. 1. MyMessages是自定义的国际化文件,放置在src的根目录下 例如有MyMessages_en_US.properties.MyMess ...

  8. 深入浅出的webpack构建工具---PostCss(五)

    一:PostCss是什么?  PostCss是一个样式处理工具,它通过自定义的插件和工具生态体系来重新定义css.它鼓励开发者使用规范的css原生语法编写代码,然后配置编译器转换需要兼容的浏览器版本, ...

  9. 使用Nginx来解决跨域的问题

    使用Nginx来解决跨域的问题 nginx的版本:(查看nginx命令: /usr/local/nginx/sbin/nginx -v) nginx/1.4.3 问题是:前端项目域名是 a.xxxx. ...

  10. AMD和CMD规范

    1.名词解释AMD:Asynchronous Modules Definition异步模块定义,提供定义模块及异步加载该模块依赖的机制.CMD:Common Module Definition 通用模 ...