python 使用__slots__来限制类的实例属性的数量_python类限制成员数量-程序员宅基地

技术标签: python  pycharm  Python  


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

class Student(object):
    pass

然后,尝试给实例绑定一个属性:

>>> s = Student()
>>> s.name = 'Michael' # 动态给实例绑定一个属性
>>> print(s.name)
Michael

还可以尝试给实例绑定一个方法:

>>> def set_age(self, age): # 定义一个函数作为实例方法
...     self.age = age
...
>>> from types import MethodType
>>> s.set_age = MethodType(set_age, s) # 给实例绑定一个方法
>>> s.set_age(25) # 调用实例方法
>>> s.age # 测试结果
25

但是,给一个实例绑定的方法,对另一个实例是不起作用的:

>>> s2 = Student() # 创建新的实例
>>> s2.set_age(25) # 尝试调用方法
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'set_age'

为了给所有实例都绑定方法,可以给class绑定方法:

>>> def set_score(self, score):
...     self.score = score
...
>>> Student.set_score = set_score

给class绑定方法后,所有实例均可调用:

>>> s.set_score(100)
>>> s.score
100
>>> s2.set_score(99)
>>> s2.score
99

通常情况下,上面的set_score方法可以直接定义在class中,但动态绑定允许我们在程序运行的过程中动态给class加上功能,这在静态语言中很难实现。

使用__slots__

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

为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:

class Student(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

然后,我们试试:

>>> s = Student() # 创建新的实例
>>> s.name = 'Michael' # 绑定属性'name'
>>> s.age = 25 # 绑定属性'age'
>>> s.score = 99 # 绑定属性'score'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'

由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。

使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:

>>> class GraduateStudent(Student):
...     pass
...
>>> g = GraduateStudent()
>>> g.score = 9999

除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__

源码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

class Student(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

class GraduateStudent(Student):
    pass

s = Student() # 创建新的实例
s.name = 'Michael' # 绑定属性'name'
s.age = 25 # 绑定属性'age'
# ERROR: AttributeError: 'Student' object has no attribute 'score'
try:
    s.score = 99
except AttributeError as e:
    print('AttributeError:', e)

g = GraduateStudent()
g.score = 99
print('g.score =', g.score)

参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017501655757856

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a772304419/article/details/120813399

智能推荐

NodeJS使用淘宝 NPM 镜像/NPM使用国内源_npm.taobao.org-程序员宅基地

文章浏览阅读4.6k次,点赞2次,收藏2次。NodeJS使用淘宝 NPM 镜像/NPM使用国内源这是一个完整npmjs.org镜像,你可以用此代替官方版本(只读),同步频率目前为10分钟一次以保证尽量与官方服务同步。当前registry.npm.taobao.org是从r.cnpmjs.org进行全量同步的. 当前npm.taobao.org运行版本是:[email protected] 本..._npm.taobao.org

经纬度转换为三维坐标_经纬度转3d-程序员宅基地

文章浏览阅读6.1k次。// 经纬度转换为球坐标double torad(double deg){ return deg/180*acos(-1);}void get_coordinate(double R,double lat,double lng,double &x,double &y,double z){ lat = torad(lat); lng = torad(lng);_经纬度转3d

室内设计——办公楼创意室内设计(包含预览图jpg和.psd文件)_办公楼内部设计-程序员宅基地

文章浏览阅读292次。一、描述 本设计用朴素的手法表现空间的本)质,传达文化的内涵。营造出一个个充满张力、层次丰富的办公空间。 各区域即独立又相互融合,亦可根据公司的使用和发展灵活调配。空间布局上层次分明,以树枝的络脉走向自然过渡到每个办公空间,用简洁的线条表现形式美,再配以恰到好处的灯光,营造出一个简洁明朗、自然通透的现代空间。二、效果图相关资源:室内设计——办公楼创意室内设计(包含预览图jpg和.psd文件).zip..._办公楼内部设计

【IDL】使用IDL对Landsat系列进行批量水体提取_landsat8的idl处理代码-程序员宅基地

文章浏览阅读3.5k次,点赞4次,收藏28次。目录landsat8landsat8_landsat8的idl处理代码

简单学习rxjs中map、concatAll、concatMap、mergeAll、mergeMap、switchAll、switchMap_concatall() mergeall-程序员宅基地

文章浏览阅读7.5k次,点赞3次,收藏7次。1、mapmap和javascript中的数组的map方法类似,不过这里为了结合下面的demo,我先用map做一个我们不想要的效果: const getData = (param) =&gt; { return of(`return: ${param}`).pipe( delay(Math.random() * 1000) ) }; from([1, ..._concatall() mergeall

建立第一篇hexo博客_hexo新建博客-程序员宅基地

文章浏览阅读735次。* 发布文章 * 过程: 先进入blog所在的文件夹,在终端输入 进入blog所在文件夹每次部署的步骤,三步 - hexo clean - hexo generate - hexo deploy* 增加tag * hexo new page ‘blog' 在source里面多了个目录life,里面有个index.md,也可以手动建立。页面格式和文章一样接着把链接加上th..._hexo新建博客

随便推点

如何评估随机森林模型以及重要预测变量的显著性-程序员宅基地

文章浏览阅读4.7w次,点赞63次,收藏334次。如何评估随机森林模型以及重要预测变量的显著性说到随机森林(random forest,RF),想必很多同学都不陌生了,毕竟这些机器学习方法目前非常流(fàn)行(làn)……白鱼同学也曾分..._incnodepurity

MEMS为何独领风骚?看完这篇秒懂!-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏6次。显微镜下的MEMS结构(注意图片上的刻度,是微米哦)文章来源:硬件十万个为什么卡西欧早年就以电机马达、继电器等机电产品闻名。如今的卡西欧本身就是MEMS的制造商之一,用MEMS的思路解决..._soc。mems

IDEA 创建Spring Boot 项目&整合jdbc详细步骤_idea2022.2.5-程序员宅基地

文章浏览阅读3.2w次,点赞48次,收藏33次。IntelliJ IDEA 创建Spring Boot 项目&整合jdbc详细步骤_idea2022.2.5

Windows Server2019安装详细步骤_windows server 2019安装教程-程序员宅基地

文章浏览阅读2.3w次,点赞11次,收藏73次。Windows Server2019安装详细教程_windows server 2019安装教程

关于Linux中的DenyHosts安装后导致自己IP被拉黑的问题-程序员宅基地

文章浏览阅读457次。关于这个问题我是第一次写,重点是本人上班第一天就碰到了。解决时间四小时方法亲测首先删除 /etc/hosts.deny中自己的ip删除 有可能不止一个然后在/etc/hosts.allow中添加自己的ip转载于:https://www.cnblogs.com/long777/p/7337617.html..._denyhosts经常拉黑

vue-awesome-swiper获取当前页的索引值_swiper4 当前页索引值-程序员宅基地

文章浏览阅读4.7k次。html<swiper ref="mySwiper" :options="swiperOptions"> <swiper-slide>Slide 1</swiper-slide> <swiper-slide>Slide 2</swiper-slide> <swiper-slide>Slide 3</swiper-slide> <swiper-slide>Slide 4</s_swiper4 当前页索引值

推荐文章

热门文章

相关标签