开发者社区 问答 正文

python 学习特殊属性时遇到的问题?报错

当我给类加上__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__ 注释掉就是好的

展开
收起
爱吃鱼的程序员 2020-06-05 15:34:29 571 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        <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']
    

     

                            感谢解答
    
    2020-06-05 15:34:43
    赞同 展开评论