我可以动态地向新样式类(派生自 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/