Python3 hasattr vs __hasattr__以及 getattr、getattr, setattr vs __setattr__的用法和区别
Python 中经常会需要判断、获取或者新建对象存在某个属性或者方法,这时就需要用到hasattr vs __hasattr__以及 getattr、getattr, setattr vs setattr。
1、首先介绍hasattr、getattr、setattr的区别。
hasattr(object, name)
判断该对象有没有name的属性和方法,return 布尔值。name存在返回True, 否则返回False
>>> class Test():
name = "victor"
def run(self):
return "Hello Python!"
>>> t = Test()
>>> hasattr(t, 'name') # 判断对象t是否存在"name"这个字符串对应的属性
True
>>> hasattr(t, 'run') # 判断对象t是否存在"run"这个字符串对应的方法
True
>>> hasattr(t, 'we_run') # 判断对象t是否存在"we_run"这个字符串对应的方法
False
getattr(object, name, [value])
获取该对象有没有相关的name的值,如果name存在,返回该name的值;如果name不存在,且默认值存在,返回默认值,否则,抛除TypeErro
>>> class Test():
name = "victor"
def run(self):
return "Hello Python!"
>>> t = Test()
>>> getattr(t, 'name') # 获取对象t是否存在"name"这个字符串对应的值,并返回
'victor'
>>> getattr(t, 'run') # 获取对象t是否存在"run"这个字符串对应的方法的内存地址,并返回
<bound method test.run of <__main__.test instance at 0x0269C878>>
>>> getattr(t, "run")() #获取run方法,后面加括号可以将这个方法运行
Hello Python!
setattr(object, name, [value])
对象的属性赋值,若属性不存在,先创建再赋值
>>> class Test():
name = "victor"
def run(self):
return "Hello Python!"
>>> t = Test()
>>> setattr(t, 'age', 18) # 设置对象t是age属性,不返回
>>> getattr(t, "age", setattr(t, "age", "18")) #age属性不存在时,设置该属性
'18'
2、介绍xxxattr、__xxxattr__的区别。
xxxattr是内置函数,调用方法为xxxattr()
__xxxattr__是对象的方法,调用方法为object.xxxattr()
明确对象时,优先使用__xxxattr.