在自己的描述符之后,__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 的工作。