getattr函数和setattr函数

2019年10月16日 / 15次阅读 / Last Modified 2019年10月16日
内置函数

python内置的两个看起来很简单,一般也不怎么用得上的函数,getattr函数和setattr函数。getattr函数用于获取对象的某个属性的值,setattr函数用于设置对象的某个属性值。

getattr函数

获取对象的某个属性值,如果属性不存在,而且又没有提供default值,抛出AttributeError。

>>> dir(10)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
>>> getattr(10,'bit_length')
<built-in method bit_length of int object at 0x55f8a5924920>
>>> getattr(10,'real')
10
>>> getattr(10.12345,'real')
10.12345
>>> getattr(10.12345,'kkkk', 'abcde')
'abcde'
>>> getattr(10.12345,'kkkk')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'float' object has no attribute 'kkkk'

以上代码首先用dir查看了10这个int对象的所有属性,然后获取bit_length属性,发现是一个函数,获取real属性,就是10。再获取一个浮点数10.12345的real属性,再获取一个不存在的kkkk属性,不过提供了默认值abcde,返回abcde,因为kkkk属性不存在。如果不提供默认值,获取不存在的kkkk属性值,抛出AttributeError异常。

python还有一个内置函数hasattr,就是通过getattr来实现的, This is implemented by calling getattr(object, name) and seeing whether it raises an AttributeError or not.)

setattr函数

顾名思义,就是设置对象的某个属性值。比较有趣的一个细节是,被设置的属性,可以是对象还不存在的属性。不过只能对自定义的对象进行这种操作,内置对象不可以。

>>> class person():
...     def __init__(self, age):
...             self.age = age
...
>>> p = person(40)
>>> p.age
40
>>> setattr(p, 'gender', 'male')
>>> p.gender
'male'
>>> setattr(p, 'age', 100)
>>> p.age
100

person这个class,一开始只有age属性,后通过setattr函数,增加了gender属性。我们其实本来就可以对对象任意增加不存在的属性值,只是如果使用setattr函数,带来一个好处,即属性的名称也可以是动态的,比如属性的名称通过某个变量来获取。

-- EOF --

本文链接:https://www.pynote.net/archives/1325

留言区

《getattr函数和setattr函数》有2条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    getattr和setattr操作的都是object,不是class。 [回复]

    • 麦新杰

      getattr可以获取class variable,而setattr只能设置instance variable. [回复]


前一篇:
后一篇:

More

麦新杰的Python笔记

Ctrl+D 收藏本页


©Copyright 麦新杰 Since 2019 Python笔记

go to top