python 学习特殊属性时遇到的问题?报错-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

爱吃鱼的程序员 2020-06-05 15:34:29 41

当我给类加上__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__ 注释掉就是好的
Python
分享到
取消 提交回答
全部回答(1)
  • 爱吃鱼的程序员
    2020-06-05 15:34:43
                        <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']
    

     

                            感谢解答
    
    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程