在自己的描述符之后,__dict__ 中缺少该属性
after own descriptor, the attribute is missing in __dict__
我想在 Python 中为对象的属性添加一些信息。稍后我想将这些数据存储在数据库中,因此知道它在表格中的格式会很整洁。
我认为 SQLAlchemy 的解决方案很好,我想这样做。
首先是一个简短的例子:
class MyAttribute(object):
def __init__(self, AttrType):
self.val = None
self.AttrType = AttrType
def __get__(self, obj, objtype):
return self.val
def __set__(self, obj, val):
self.val = val
class MyClass(object):
Attr1 = MyAttribute('int(11)')
def __init__(self):
self.Attr1 = 44
self.Attr2 = 55
x = MyClass()
print("Attr1: %s"%x.Attr1)
print("Attr2: %s"%x.Attr2)
print(x.__dict__)
这个脚本的输出是:
Attr1: 44
Attr2: 55
{'Attr2': 55}
现在我的问题是:__dict__
中有 Attr2
,但没有 Attr1
。为什么?我怎样才能添加它?哪个功能负责? (我的读法是__set__
,正确吗?)我必须添加什么,将属性对象添加到字典中的位置?
尝试 MyClass.__dict__
:
>>> MyClass.__dict__['Attr1']
<__main__.MyAttribute object at 0x000000000296A5F8>
描述符存储在 class 对象中,而不是实例对象中。由于这个原因,您实际上在这里遇到了麻烦:
>>> x = MyClass()
>>> x.Attr1
44
>>> y = MyClass()
>>> y.Attr1 = 66
>>> y.Attr1
66
>>> x.Attr1
66 # uh oh
跟踪哪些数据属于哪个实例是 MyAttribute 的工作。
我想在 Python 中为对象的属性添加一些信息。稍后我想将这些数据存储在数据库中,因此知道它在表格中的格式会很整洁。 我认为 SQLAlchemy 的解决方案很好,我想这样做。
首先是一个简短的例子:
class MyAttribute(object):
def __init__(self, AttrType):
self.val = None
self.AttrType = AttrType
def __get__(self, obj, objtype):
return self.val
def __set__(self, obj, val):
self.val = val
class MyClass(object):
Attr1 = MyAttribute('int(11)')
def __init__(self):
self.Attr1 = 44
self.Attr2 = 55
x = MyClass()
print("Attr1: %s"%x.Attr1)
print("Attr2: %s"%x.Attr2)
print(x.__dict__)
这个脚本的输出是:
Attr1: 44
Attr2: 55
{'Attr2': 55}
现在我的问题是:__dict__
中有 Attr2
,但没有 Attr1
。为什么?我怎样才能添加它?哪个功能负责? (我的读法是__set__
,正确吗?)我必须添加什么,将属性对象添加到字典中的位置?
尝试 MyClass.__dict__
:
>>> MyClass.__dict__['Attr1']
<__main__.MyAttribute object at 0x000000000296A5F8>
描述符存储在 class 对象中,而不是实例对象中。由于这个原因,您实际上在这里遇到了麻烦:
>>> x = MyClass()
>>> x.Attr1
44
>>> y = MyClass()
>>> y.Attr1 = 66
>>> y.Attr1
66
>>> x.Attr1
66 # uh oh
跟踪哪些数据属于哪个实例是 MyAttribute 的工作。