python丢失数据描述符作为实例属性?

时间:2018-01-31 03:52:24

标签: python-3.x instance attr descriptor

class data_attr_set_pass(object):
    def __init__(self, inner=None, name=""):
        self.inner = inner
        self.name = name
    def __get__(self, instance, owner):
        return self.inner
    def __set__(self, instance, value):
        pass
    def __repr__(self):
        return str(self.name) + ":" + str(self.inner)

class data_attr(object):
    def __init__(self, inner=None, name=""):
        self.inner = inner
        self.name = name
    def __get__(self, instance, owner):
        return self.inner
    def __set__(self, instance, value):
        self.inner = value
    def __repr__(self):
        return str(self.name) + ":" + str(self.inner)

class non_data_attr(object):
    def __init__(self, inner=None, name=""):
        self.inner = inner
        self.name = name
    def __get__(self, instance, owner):
        return self.inner
    def __repr__(self):
        return str(self.name) + ":" + str(self.inner)

class Myclass(object):
    x = data_attr_set_pass(11, "class attr")
    def __init__(self):
        self.x = data_attr(890, "instance attr")
print(Myclass.x)
m = Myclass()
print(Myclass.x)
print(m.x)
print(Myclass.__dict__)
print(m.__dict__)

输出:

11
11
11
{'__module__': '__main__', 'x': class attr:11, '__init__': <function Myclass.__init__ at 0x7f0dcc2d1378>, '__dict__': <attribute '__dict__' of 'Myclass' objects>, '__weakref__': <attribute '__weakref__' of 'Myclass' objects>, '__doc__': None}
{}      

我对python数据描述符的使用进行了一些测试。一次测试有非常奇怪的行为。我知道描述符应该是class attr,它只是一个测试:)。 我把__set__课程data_attr_set_pass传入了。据我所知,self.x = data_attr(890, "instance attr")中的__init__会将data_attr(890, "instance attr")放入self.__dict__。但它无处可寻。

为什么会发生这种情况?我在哪里可以找到数据描述符?

=============================================== ===================

这真的是我的误解,我只是在下面的代码中运行第一个测试,我直接将{2}放入self.__dict__["x"],第二个可以证明它。

class Myclass(object):
    x = data_attr_set_pass(11, "class attr")
    def __init__(self):
        self.__dict__["x"] = 2
print(Myclass.x)
m = Myclass()
print(Myclass.x)
print(m.x)
print(Myclass.__dict__)
print(m.__dict__)


print('================')
class Myclass(object):
    x = data_attr_set_pass(1324, "class attr")
    def __init__(self):
        self.x = 2232
print(Myclass.x)
m = Myclass()
print(Myclass.x)
print(m.x)
print(Myclass.__dict__)
print(m.__dict__)             

1 个答案:

答案 0 :(得分:0)

你说

  

我在课程__set__的{​​{1}}中加了一遍。据我所知,data_attr_set_pass中的self.x = data_attr(890, "instance attr")会将__init__放入data_attr(890, "instance attr")

但为什么会这样呢?您没有编写self.__dict__来将值插入实例data_attr_set_pass.__set__。您已将__dict__写为除了__set__之外什么都不做。

pass分配内容完全符合您撰写self.x要执行的操作:没有。