正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。
动态语⾔:可以在运⾏的过程中,修改代码
静态语⾔:编译时已经确定好代码,运⾏过程中不能修改
但是,如果我们想要限制class的属性怎么办?比如,上例只允许对人类的实例添加 name 和 age 属性。
为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__ 变量,来限制该class能添加的属性:
先定义一个学生的类class:
# -*- coding: utf-8 -*-
# @author: Flyme awei
# @Time : 2022/7/1 20:02
class Student(object):
# 只允许当前Student拥有name和sex属性,用tuple定义允许
__slots__ = ('name', 'age')
if __name__ == '__main__':
s1 = Student()
s1.name = '吕布'
s1.age = 18
s1.sex = '男'
测试:
首先,我们创建了一个学生对象s1,给s1一个name和age属性,给定成功,
但是,当我们给实例s1一个score的属性时,提示"Person instance has no attribute ‘score’"报错
由此可以看出来, slots 限制了对象的属性随意添加。
需要注意一点的是:使⽤__slots__ 要注意__slots__ 定义的属性仅对当前类实例起作⽤,对继承的⼦类是不起作⽤的
# python交互式环境
class subStudent(Student):
pass
测试:
>>> sub1 = subStudent()
>>> sub1.score = 100
>>> sub1.score
100