Python:动态添加属性到新式类/对象

标签 python attributes metaprogramming

我可以动态地向新样式类(派生自 object 的实例)的实例添加属性吗?

详细信息:

我正在使用 sqlite3.Connection 的一个实例。简单地扩展类不是一个选项,因为我没有通过调用构造函数来获取实例;我通过调用 sqlite3.connect() 获得它。

构建一个包装器并没有为我编写的代码节省很多。

python 2.7.1

编辑

所有答案都是正确的。但是我仍然没有达到我的目标; sqlite3.Connection 的实例禁止我尝试以下列方式设置属性(object 本身的实例也是如此)。我总是得到一个 AttributeError:

> conn = sqlite3.connect([filepath])
> conn.a = 'foo'
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    conn.a = 'foo'
AttributeError: 'object' object has no attribute 'a'
> conn.__setattr__('a','foo')
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    conn.__setattr__('a','foo')
AttributeError: 'object' object has no attribute 'a'

帮忙吗?

最佳答案

是的,除非类(class)使用 __slots__或者通过覆盖 __setattr__ 来防止属性写入,或内部 Python 类,或 native 实现的 Python 类(通常在 C 中)。

你总是可以尝试设置一个属性。除了非常奇怪的 __setattr__ 实现之外,将属性分配给上述类型之一的类的实例应该引发 AttributeError。 在这些情况下,您必须使用包装器,如下所示:

class AttrWrapper(object):
  def __init__(self, wrapped):
    self._wrapped = wrapped
  def __getattr__(self, n):
    return getattr(self._wrapped, n)
conn = AttrWrapper(sqlite3.connect(filepath))

关于Python:动态添加属性到新式类/对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6082625/

相关文章:

python - Fabric 要求输入 root 密码

javascript 增量(大于++)样式属性

c++ - 如何使用作为模板参数的模板

c++ - 与可变参数模板一起使用的基类列表

python - 反斜杠将带重音字母的字符串转义为 ascii

python - Matplotlib:轮廓上的颜色条没有条纹

javascript - 选择具有特定数据属性 Javascript 的所有元素?

python - 在不创建对象的情况下使用python中类的属性

ruby self.class.class_eval 或 singleton_class.class_eval

python - Numpy:如何检查 ndarray 中是否存在元组