Python hasattr()函数

hasattr() 函数用来判断某个类实例对象是否包含指定名称的属性方法。该函数的语法格式如下:

hasattr(obj, name)

其中 obj 指的是某个类的实例对象,name 表示指定的属性名或方法名。同时,该函数会将判断的结果(True 或者 False)作为返回值反馈回来。

举个例子:

class CLanguage:def __init__ (self):self.name = "C语言中文网"self.add = "http://c.biancheng.net"def say(self):print("我正在学Python")clangs = CLanguage()
print(hasattr(clangs,"name"))
print(hasattr(clangs,"add"))
print(hasattr(clangs,"say"))

程序输出结果为:
True
True
True

显然,无论是属性名还是方法名,都在 hasattr() 函数的匹配范围内。因此,我们只能通过该函数判断实例对象是否包含该名称的属性或方法,但不能精确判断,该名称代表的是属性还是方法。


Python getattr() 函数

getattr() 函数获取某个类实例对象中指定属性的值。没错,和 hasattr() 函数不同,该函数只会从类对象包含的所有属性中进行查找

getattr() 函数的语法格式如下:

getattr(obj, name[, default])

其中,obj 表示指定的类实例对象,name 表示指定的属性名,而 default 是可选参数,用于设定该函数的默认返回值,即当函数查找失败时,如果不指定 default 参数,则程序将直接报 AttributeError 错误,反之该函数将返回 default 指定的值。

举个例子:

class CLanguage:def __init__ (self):self.name = "C语言中文网"self.add = "http://c.biancheng.net"def say(self):print("我正在学Python")clangs = CLanguage()
print(getattr(clangs,"name"))
print(getattr(clangs,"add"))
print(getattr(clangs,"say"))
print(getattr(clangs,"display",'nodisplay'))

程序执行结果为:

C语言中文网
http://c.biancheng.net
<bound method CLanguage.say of <__main__.CLanguage object at 0x000001FC2F2E3198>>
nodisplay

可以看到,对于类中已有的属性,getattr() 会返回它们的值,而如果该名称为方法名,则返回该方法的状态信息;反之,如果该明白不为类对象所有,要么返回默认的参数,要么程序报 AttributeError 错误。


Python setattr()函数

setattr() 函数的功能相对比较复杂,它最基础的功能是修改类实例对象中的属性值。其次,它还可以实现为实例对象动态添加属性或者方法

1、修改类实例对象中的属性值

2、将类方法修改成一个类属性

3、为实例对象动态添加属性或者方法

setattr() 函数的语法格式如下:

setattr(obj, name, value)

1、修改类实例对象中的属性值

首先,下面例子演示如何通过该函数修改某个类实例对象的属性值:

class CLanguage:def __init__ (self):self.name = "C语言中文网"self.add = "http://c.biancheng.net"def say(self):print("我正在学Python")clangs = CLanguage()print(clangs.name)
print(clangs.add)setattr(clangs,"name","Python教程")
setattr(clangs,"add","http://c.biancheng.net/python")print(clangs.name)
print(clangs.add)

程序运行结果为:

C语言中文网
http://c.biancheng.net
Python教程
http://c.biancheng.net/python

2、将类方法修改成一个类属性

甚至利用 setattr() 函数,还可以将类属性修改为一个类方法,同样也可以将类方法修改成一个类属性。例如:

def say(self):print("我正在学Python")class CLanguage:def __init__ (self):self.name = "C语言中文网"self.add = "http://c.biancheng.net"clangs = CLanguage()print(clangs.name)
print(clangs.add)
setattr(clangs,"name",say)
clangs.name(clangs)

程序运行结果为:

C语言中文网
http://c.biancheng.net
我正在学Python

显然,通过修改 name 属性的值为 say(这是一个外部定义的函数),原来的 name 属性就变成了一个 name() 方法。

3、为实例对象动态添加属性或者方法

使用 setattr() 函数对实例对象中执行名称的属性或方法进行修改时,如果该名称查找失败,Python 解释器不会报错,而是会给该实例对象动态添加一个指定名称的属性或方法。例如:

def say(self):print("我正在学Python")class CLanguage:passclangs = CLanguage()setattr(clangs,"name","C语言中文网")
setattr(clangs,"say",say)print(clangs.name)
clangs.say(clangs)
程序执行结果为:

C语言中文网
我正在学Python

可以看到,虽然 CLanguage 为空类,但通过 setattr() 函数,我们为 clangs 对象动态添加了一个 name 属性和一个 say() 方法。

Python setattr()、getattr()、hasattr()函数用法详解

setattr()、getattr()、hasattr()【设置属性和方法、得到属性、判断是否有属性和方法】相关推荐

  1. java中获取绝对值的方法_Java完美判断绝对值的两种方法 | 彬菌

    版权声明:转载原创文章请以超链接形式请注明原文章出处,尊重作者,尊重原创! 恰饭广告 if-else语句判断: import java.util.Scanner; public class Absol ...

  2. 传智播客python笔记_python传智播客笔记--第十天:隐藏属性,私有属性,私有方法,__del__方法,类的继承,类中方法的重写...

    封装,继承,多态 隐藏属性,私有属性,私有方法,__del__方法,类的继承,类中方法的重写 -**************************************************** ...

  3. Python设置属性值方法setattr()和判断变量是否存在的方法

    介绍Python设置属性值方法setattr()和判断变量是否存在的方法 1.以属性名为变量的方式给一个对象添加属性 使用 setattr 方法 obj = SomeClass() key = 'ke ...

  4. 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)

    27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...

  5. java判断对象无数据_java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值...

    1.java利用反射机制判断对象的属性是否为空: Map validateMap = new LinkedHashMap(); validateMap.put("serial", ...

  6. Python属性、方法和类管理系列之----属性初探

    在学习dict的时候,肯定听过dict是Python中最重要的数据类型,但是不一定知道为什么.马上你就会明白原因了. Python中从模块.到函数.到类.到元类,其实主要管理方法就是靠一个一个的字典. ...

  7. python如何对一个属性或方法进行封装_python 类、对象、方法、属性

    在python中,一个对象的特征也称为属性(attribute).它所具有的行为也称为方法(method) 结论:对象=属性+方法 在python中,把具有相同属性和方法的对象归为一个类(class) ...

  8. python 判断类是否有某个属性_python判断对象某个属性的方法有哪些

    python判断对象某个属性的方法有哪些 发布时间:2020-08-10 15:41:04 来源:亿速云 阅读:92 作者:小新 这篇文章给大家分享的是有关python判断对象某个属性的方法有哪些的内 ...

  9. python setattr/getattr

    对照字典的get/update用于获取/更新键值: test_dic = {"Lisa": 18, "Tom": 17, "Lus": 16 ...

最新文章

  1. SAP HUM 使用HU02将几个HU打包到一个外层新的HU号码里
  2. 征集并发文献译者之Disruptor
  3. Apache Commons Fileupload 漏洞,可恶意操作文件
  4. 高并发编程基础(java.util.concurrent包常见类基础)
  5. 写一个脚本定时自动备份mysql到指定目录
  6. python获取eth0_Python获取网卡信息(名称、MAC、IP、网关等)
  7. WPF轮播图实现方式(二)
  8. Constructor总结
  9. redhat 6.6 安装 (LVM)
  10. OpenCV-Python bindings是如何生成的(2)
  11. 开课吧:深入了解人工智能在金融行业中的应用
  12. 一本关于网上支付解决方案的迷你百科全书
  13. php ddos 防御,PHP DDos的几个防御方法
  14. linux命令行如何打开浏览器,Linux下的命令行浏览器links
  15. 程序员工资一般多少_一般程序员真实工资 程序员工资薪酬大起底
  16. win7无法连接打印机拒绝访问_打印机拒绝访问,小编教你打印机拒绝访问无法连接怎么解决...
  17. 艾肯6nano声卡安装调试教程
  18. ServiceNow CSA管理员考试(ServiceNow Fundamentals (On Demand) Paris)
  19. 不只是同构应用(isomorphic 工程化你所忽略的细节)
  20. :要求查询出每一个雇员的编号,姓名,工资,领导的姓名,部门名称及位置,工资所在公司的工资等级

热门文章

  1. JEECG - 基于代码生成器的J2EE智能开发框架 续四: 查询条件SQL生成器设计思路
  2. Linux系统:常用Linux系统管理命令总结
  3. MCMC方法与变分推断
  4. 再问数据中台 - 数据中台和业务中台服务有什么区别 应该如何去界定和划分?
  5. minSdkVersion、compileSdkVersion和targetSdkVersion
  6. Double.valueOf()与Double.parseDouble()两者的区别
  7. 揭秘淘宝286亿海量图片存储与处理架构,互联网营销
  8. 华为ebgp_BGP选路原则之首选值(华为特性)
  9. hadoop java访问_Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群
  10. 信息学奥赛一本通 1159:斐波那契数列