在自己的描述符之后,__dict__中缺少该属性

时间:2015-05-26 14:26:33

标签: python descriptor

我想在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__,对吗?)我有什么要添加将属性对象添加到dict的位置?

1 个答案:

答案 0 :(得分:1)

尝试MyClass.__dict__

>>> MyClass.__dict__['Attr1']
<__main__.MyAttribute object at 0x000000000296A5F8>

描述符存储在类对象中,而不是实例对象中。你真的在这里遇到了麻烦,因为这个原因:

>>> x = MyClass()
>>> x.Attr1
44
>>> y = MyClass()
>>> y.Attr1 = 66
>>> y.Attr1
66
>>> x.Attr1
66 # uh oh

MyAttribute的工作是跟踪哪些数据属于哪个实例。