当我给类加上__slots__属性后,打印类的实例的__dict__属性会报错。
错误信息:AttributeError: 'Demo' object has no attribute '__dict__',去掉__slots__属性就好了这是什么情况??有python大神能指点一哈嘛?
代码如下:
class Demo(object):
__slots__ = ('sex',)
def __init__(self, sex):
self.sex = sex
super(Demo, self).__init__()
x = Demo('男')
print(Demo.__dict__)
print(x.__dict__) # 有__slots__ 时,这块就会报错,把__slots__ 注释掉就是好的
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
<p><a>[Python] dir() 与 __dict__,__slots__ 的区别 </a>指出:<br> "不是所有的对象都有 __dict__ 属性。例如,如果你在一个类中添加了 __slots__ 属性,那么这个类的实例将不会拥有 __dict__ 属性,但是 dir() 仍然可以找到并列出它的实例所有有效属性"。</p>
代码: print(Demo.__dict__) 是要打印出类 class Demo 的字典。这行代码没错。结果这个类的字典就打印出来了。
然而,楼主的代码,在类 Demo 中添加了__slots__ 属性:
__slots__ = ('sex',)
因此,Demo 类的实例 x 将不再拥有 __dict__ 属性,如果遇到要显示这个不再拥有的属性( __dict__), 如代码: x.__dict__ ,当然要报错。
不过,调用 dir() 仍然可以找到并列出它的实例, 即x,的所有有效属性, 包括 __lots__ 和 sex。
下列代码,可以证明以上解释:
class Demo(object):
__slots__ = ('sex',)
def __init__(self, sex):
self.sex = sex
super(Demo, self).__init__()
x = Demo('男')
print(Demo.__dict__)
print(x.sex)
print(dir(x))
输出:
{'__module__': '__main__', '__slots__': ('sex',), '__init__': <function Demo.__init__ at 0x005CA810>, 'sex': <member 'sex' of 'Demo' objects>, '__doc__': None}
男
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'sex']
感谢解答