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()

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. (3)HomeAssistant 连接MQTT

    整体说明 1 自己在阿里云上搭建MQTT服务器 2 自己笔记本电脑windos10搭建HASS,配置参数连接阿里云服务器 3 手机下载MQTT调试助手,当测试端 4手机当终端---阿里云MQTT--- ...

  2. Qt 编程指南 3_1 按钮弹窗手动和自动关联示例

    触发的两种模式 connect() 和 on_控件ID_控件函数(参数) 两者优缺点对比: 虽然 Qt 有比较好用的自动关联大法,但自动关联不是万能的,尤其是涉及到多个窗体的时候,比如 A 窗体私有按 ...

  3. Codeforces Round #553 (Div. 2) D. Stas and the Queue at the Buffet 贪心+公式转化

    题意 给出n个pair (a,b) 把它放在线性序列上 1--n 上 使得  sum(a*(j-1)+b*(n-j))  最小 思路 :对式子进行合并 同类项 有:    j*(a-b)+  (-a+ ...

  4. 转载 线程初步了解 - <第一篇>

    操作系统通过线程对程序的执行进行管理,当操作系统运行一个程序的时候,首先,操作系统将为这个准备运行的程序分配一个进程,以管理这个程序所需要的各种资源.在这些资源之中,会包含一个称为主线程的线程数据结构 ...

  5. Ubuntu下更改Python版本

    https://www.jianshu.com/p/9d3033d1b26f 有些命令运行失败,是因为权限不够,前面加上 sudo 首先查看Python默认版本: ubuntu@user~$:pyth ...

  6. nginx的反向代理proxy_pass指令

    1. 首先什么是代理服务器?客户机发送请求时,不会直接发送到目的主机,而是先被代理服务器收到,代理服务器收到客服机的请求后,再向目的机发出,目的机就会返回数据给客户机,在返回给客户机之前,会被代理服务 ...

  7. java 学习------JDK1.8安装与配置

    1.下在JDK 1.8 2.解压安装 (一般选择默认路径安装) 3.配置环境变量     (我的电脑是windows10 系统) (1)计算机→属性→高级系统设置→高级→环境变量 (2)添加 JAVA ...

  8. SkylineGlobe 从v6.1到v6.5 二次开发方面的变化参考

       2.1关于 TerraExplorer v6.5 API 除了一些新的功能,API v6.5不同于API v6.1的最大改进是其对象ID系统.虽然在以前版本的API中,有两个ID系统,一个用于对 ...

  9. Vue-使用json-server快速“伪造”后台接口

    JSON-Server主要的作用是搭建一台JSON服务器,测试一些业务逻辑(我之前都是采用读取文件的方式尴尬).一.安装 npm install --save json-server 前提是已经安装好 ...

  10. C# yield关键词使用

    C#有一个关键词yield,简化遍历操作实现的语法糖. 下面Insus.NET使用例子来说明,就拿昨晚的一篇<从字符串数组中把数字的元素找出来> http://www.cnblogs.co ...