正常情况下,当我们定义了一个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加上功能,这在静态语言中很难实现。
但是,如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name
和age
属性。
为了达到限制的目的,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
文章浏览阅读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
文章浏览阅读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
文章浏览阅读292次。一、描述 本设计用朴素的手法表现空间的本)质,传达文化的内涵。营造出一个个充满张力、层次丰富的办公空间。 各区域即独立又相互融合,亦可根据公司的使用和发展灵活调配。空间布局上层次分明,以树枝的络脉走向自然过渡到每个办公空间,用简洁的线条表现形式美,再配以恰到好处的灯光,营造出一个简洁明朗、自然通透的现代空间。二、效果图相关资源:室内设计——办公楼创意室内设计(包含预览图jpg和.psd文件).zip..._办公楼内部设计
文章浏览阅读3.5k次,点赞4次,收藏28次。目录landsat8landsat8_landsat8的idl处理代码
文章浏览阅读7.5k次,点赞3次,收藏7次。1、mapmap和javascript中的数组的map方法类似,不过这里为了结合下面的demo,我先用map做一个我们不想要的效果: const getData = (param) => { return of(`return: ${param}`).pipe( delay(Math.random() * 1000) ) }; from([1, ..._concatall() mergeall
文章浏览阅读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
文章浏览阅读1k次,点赞2次,收藏6次。显微镜下的MEMS结构(注意图片上的刻度,是微米哦)文章来源:硬件十万个为什么卡西欧早年就以电机马达、继电器等机电产品闻名。如今的卡西欧本身就是MEMS的制造商之一,用MEMS的思路解决..._soc。mems
文章浏览阅读3.2w次,点赞48次,收藏33次。IntelliJ IDEA 创建Spring Boot 项目&整合jdbc详细步骤_idea2022.2.5
文章浏览阅读2.3w次,点赞11次,收藏73次。Windows Server2019安装详细教程_windows server 2019安装教程
文章浏览阅读457次。关于这个问题我是第一次写,重点是本人上班第一天就碰到了。解决时间四小时方法亲测首先删除 /etc/hosts.deny中自己的ip删除 有可能不止一个然后在/etc/hosts.allow中添加自己的ip转载于:https://www.cnblogs.com/long777/p/7337617.html..._denyhosts经常拉黑
文章浏览阅读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 当前页索引值