python笔记 getattr() delattr() setattr() hasattr()

2023-05-16

python是动态语言,类型可以在运行时而不是编译时确定,因此就有了非脚本语言所没有的特性,可以动态设置对象的属性(attr),可以使用python内置函数getattr()、delattr()、setattr()、hasattr()实现对象属性的动态设置,获取,删除和存在性判断。

hasattr()

描述:hasattr()函数用于判断是否包含对应的属性
语法:hasattr(object,name)
参数:
object–对象
name–str字符串,属性名
返回值:如果对象有该属性返回True,否则返回False

getattr()

描述:getattr()函数用于返回一个对象属性值
语法:getattr(object,name,default)
参数:
object–对象
name–字符串,对象属性
default–默认返回值,如果不提供该参数,在没有对于属性时,将触发AttributeError。
返回值:返回对象属性值

setattr()

描述:setattr函数,用于设置属性值,该属性必须存在
语法:setattr(object,name,value)
参数:
object–对象
name–字符串,对象属性
value–属性值
返回值:无

delattr()

描述:delattr函数用于删除属性,delattr(x,'foobar)相当于del x.foobar
语法:setattr(object,name)
参数:
object–对象
name–必须是对象的属性
返回值:无

以上四种方法非常强大,甚至让人感觉可以在代码中动态的构造任意带有不同方法、属性的对象。见过的用法是,使用一个thread local的对象,然后不停的往对象上挂一些需要进行thread share的对象或函数,使其成为进程里一个公共的工具箱。当然这样做处理不当的话,可能造成的结果是内存泄漏。同时这些方法可以方便的动态构造出大体上相同但有某些字段有差异的数据类型对象。

再介绍一些和该功能不一样但是意义上差不多的setter,getter等装饰器。
如果对象中某些属性是计算而来的,但是希望直接像是属性意义获取,可以将其包上@property 的语法糖,套上此装饰器的函数将返回值作为一个属性使用,当然这样就无法直接进行赋值了。

如果对象中有一些私有属性,想限制用户的访问,修改等操作,甚至希望在用户使用之前对其做一些预先校验,可以使用@x.setter @x.deleter,@x.getter语法糖。

class Student(object):
    def __init__(self,name,score):
        self.name = name
        self.__score = score
    @property
    def score(self):
        return self.__score
    @score.setter
    def score(self,score):
        if not isinstance(score,int):
            raise ValueError('score must be a Integer')
        if score < 0 or score > 100:
            raise ValueError('score must between 0~100!!!')
        self.__score = score
s = Student('张三',59)
s.score = 60
print(s.score)

该语法糖限制用户只能通过我们希望的方式和规则更新和获取一些属性,当用户想获取私有的属性但不允许进行更改时,我们可以只对其设置getter,而不设置setter,当用户错误但使用该属性时会报错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python笔记 getattr() delattr() setattr() hasattr() 的相关文章

随机推荐