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__)
答案 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
要执行的操作:没有。