我看__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__ 属性并没有起到限制的作用呀,求大神告知是怎么会是,搞得我很懵
<p> 就子类而言,若其父类(超类),未曾用__slots__定义的属性 对自身的属性加以限制,子类用__slots__ 来限制属性,是没有用的。因为子类的对象添加的任何属性,都认为是其父类添加的、而后子类继承的属性。<br> 请看下列案例:</p>
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:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。