Jel*_*Cat 7 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'
Run Code Online (Sandbox Code Playgroud)
救命?
是的,除非该类__slots__通过覆盖使用或阻止属性编写__setattr__,或内部Python类或本机实现的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))
Run Code Online (Sandbox Code Playgroud)