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

标签 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__,对吗?)我必须添加什么才能将属性对象添加到字典中?

最佳答案

尝试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 的工作是跟踪哪些数据属于哪个实例。

关于python - 在自己的描述符之后,__dict__ 中缺少该属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30461391/

相关文章:

python - Tensorflow 对象检测 API 裁剪图像片段

python - 如何为 GPU 设备指定或设置变量

python - 如何获取属性的文档字符串属性?

python - 我应该使用描述符类还是属性工厂?

python - 如何使用 NLTK 正则表达式模式用 UP/DOWN 指标注释财经新闻?

python - 匹配对象的算法

python - 异步设置python3.5中的描述符

c++ - 点云的描述符

python - 为什么托管属性只适用于类属性而不适用于 python 中的实例属性?

python - 如何删除字符串值上的 '\n' 或将 ByteIO 正确转换为列表?