【Python面向对象进阶②】——__slots__限制类动态增加属性

150 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情

🤵‍♂️ 个人主页: @Flyme awei 个主页 👨‍💻 作者简介:Python领域新星创作者。 📒 系列专栏:《在线编程-Python篇》 🌐 推荐一款找工作神器网站: 《牛客网》 |笔试题库|面试经验|实习招聘内推| 🐋 希望大家多多支持😘一起进步呀! 📝 如果文章对你有帮助的话,欢迎评论💬点赞👍收藏📂加关注

__slots__限制类动态的增加属性

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。

动态语⾔:可以在运⾏的过程中,修改代码

静态语⾔:编译时已经确定好代码,运⾏过程中不能修改

但是,如果我们想要限制class的属性怎么办?比如,上例只允许对人类的实例添加 nameage 属性。

为了达到限制的目的,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一个nameage属性,给定成功,
但是,当我们给实例s1一个score的属性时,提示'Student' object has no attribute 'sex'报错

由此可以看出来, __slots__ 限制了对象的属性随意添加。

需要注意一点的是:使⽤__slots__ 要注意__slots__ 定义的属性仅对当前类实例起作⽤,对继承的⼦类是不起作⽤的

# python交互式环境 
class subStudent(Student): 
	pass

测试:

>>> sub1 = subStudent() 
>>> sub1.score = 100 
>>> sub1.score 
100