Python Morsels:Python的setattr函数

125 阅读2分钟

Python 内置的setattr 函数可以动态地设置属性,给定一个对象,一个代表属性名称的字符串,以及一个要分配的值。

内容表

  1. 需要动态地设置一个属性?
  2. Python 内置的setattr 函数可以帮上忙。
  3. 为什么不直接更新__dict__
  4. 为什么不调用__setattr__ 呢?
  5. 如果你能避免的话,不要使用setattr
  6. 使用 Python 的setattr 函数进行动态属性赋值

需要动态地设置一个属性?

我们想做一个这样的类。

>>> row = Row(id=4, name="duck", action="quack", color="purple") >>> row.id 4 >>> row.name 'duck'

>>> row = Row(id=4, name="duck", action="quack", color="purple") >>> row.id 4 >>> row.name 'duck'

我们的Row 类应该接受任意数量的关键字参数,并将每个参数分配给一个新的Row 对象上的一个属性。

我们可以使用Python 的** 操作符来捕获任意的关键字参数到一个字典中。

class Row: def __init__(self, **attributes): for attribute, value in attributes.items(): ... # What should we do now?

class Row: def __init__(self, **attributes): for attribute, value in attributes.items(): ... # What should we do now?

但是我们需要一些方法来把我们的Row 对象上的每一个项目存储为一个新的属性

通常,属性赋值使用= 符号和. 符号。

>>> row.color = "purple"

>>> row.color = "purple"

但是我们不能使用. 符号,因为我们的属性名是用字符串存储的。例如,变量attribute 可能包含字符串"color" (代表我们要分配给的color 属性)。

>>> attribute = "color" >>> value = "purple"

>>> attribute = "color" >>> value = "purple"

而如果我们尝试使用 Python 通常的属性赋值符号。

>>> row.attribute = value

>>> row.attribute = value

我们最终会得到一个叫做attribute 的属性,而不是一个叫做color 的属性。

>>> row.attribute 'purple'

>>> row.attribute 'purple'

我们需要一些方法来动态地分配一个属性!

Python 内置的setattr 函数来拯救我们

Python的setattr 函数接受一个...

阅读全文:https://www.pythonmorsels.com/python-setattr/