开发者社区> 问答> 正文

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

我看__slots__说的是现在类的实例允许添加的属性,然后简单试了一下:

class Demo(object):
    __slots__ = ('sex',)

    def __init__(self, sex):
        self.sex = sex
        super(Demo, self).__init__()

x = Demo('男')
x.name = 'xx'  # 加上__slots__ 后确实可以限制,所以我这块会报错:AttributeError: 'Demo' object has no attribute 'name'

但是我又写了一个例子,发现加上__slots__后限制不了实例添加的属性,很疑惑不知是怎么回事,代码如下:

class Person(object):

    def __init__(self, name, age):
        self.name = name
        self.age = age
        super(Person, self).__init__()


class Student(Person):
    __slots__ = ('grade',)

    def __init__(self, name, age, grade, sex):
        self.grade = grade
        self.sex = sex
        super(Student, self).__init__(name, age)

s = Student('呵呵', 18, 12,'nan')
s.grade = 33
s.name = 'xx'
s.sex = 'nv'  

我__slots__属性只设置了grade,但是我可以给name和sex设置值,也不报错,貌似__slots__ 属性并没有起到限制的作用呀,求大神告知是怎么会是,搞得我很懵

展开
收起
爱吃鱼的程序员 2020-06-05 15:33:59 478 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        <p>    就子类而言,若其父类(超类),未曾用__slots__定义的属性 对自身的属性加以限制,子类用__slots__ 来限制属性,是没有用的。因为子类的对象添加的任何属性,都认为是其父类添加的、而后子类继承的属性。<br> 请看下列案例:</p> 
    
    1. 由于父类 Person 未曾用__slots__ 函数 对自身的属性加以限制,即使子类使用了 _lsots_ , 仍然可以任意为双方(子类、或父类) 的对象 添加属性, 比如添加: "homeplace 祖籍"。子类的所有添加的额外属性,都可以认为是继承(来自)父类的添加的属性。
    2. 如果父类 Person 使用__slots_ 函数 对它的属性加以任何限制,则代码就无法运行。
      class Person(object):
          #__slots__ = ('BirthPlace',)
          def __init__(self, name, age):
              self.name = name
              self.age = age
              super(Person, self).__init__()
      
      class Student(Person):
          __slots__ = ('grade',)
      
          def __init__(self, name, age, grade, sex):
              self.grade = grade
              self.sex = sex
              super(Student, self).__init__(name, age)
      
      s = Student('刘耀祖', 18, 12,'男')
      s.homeplace='河南'
      print(s.name, s.sex, s.age, '岁', '年级:',s.grade, '祖籍:', s.homeplace)
      p = Person('刘孟德','78')
      p.homeplace='河南'
      print( p.name, p.age, '岁', '祖籍', p.homeplace)
       输出:
      刘耀祖 男 18 岁 年级: 12 祖籍: 河南
      刘孟德 78 岁 祖籍 河南

       

     

                            学到了!谢谢解答:pray:
    
    2020-06-05 15:34:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载