限制属性绑定(__slots__)
正常情况下,当定义了一个class并创建实例后,可以给该实例绑定任何属性和方法,这就是动态语言的灵活性
属性和方法是可以直接定义在class中的,但动态绑定允许在程序运行的过程中动态给class加上属性和方法,这在静态语言中很难实现
对于python这种动态语言,给一个实例绑定的属性和方法,对另一个实例是不起作用的
为了给所有实例都绑定方法,可以通过给class绑定属性和方法的方式实现,就是定义类属性和类方法
但如果所有对象都可随意绑定,则会导致程序很混乱,因此需要对实例的绑定进行一些限制
为了达到限制的目的,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'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误
__slots__仅对当前类实例起作用,对继承的子类是不起作用的
class GraduateStudent(Student):
pass g = GraduateStudent()
g.score = 9999 #不报错,子类没有定义__slots__,因此不受影响
如果子类也需要进行限制,则在子类中也定义__slots__,这样子类实例允许定义的属性就是自身的__slots__加上父类的__slots__
class GraduateStudent01(Student):
__slots__ = ('score') # 用tuple定义允许绑定的属性名称 g01 = GraduateStudent01()
g01.name = 'Michael' # 绑定属性'name',父类定义允许绑定该属性
g01.age = 25 # 绑定属性'age',父类定义允许绑定该属性
g01.score = 99 # 绑定属性'score',子类定义允许绑定该属性
g01.city = 'DaLian' #报错,要绑定的属性'city'没有被放到父类和子类的__slots__中
限制属性绑定(__slots__)的更多相关文章
- Python实例属性限制(__slots__)
Python的动态绑定可以在程序运行的过程中对实例或class加上功能,但是如果我们想要限制实例的属性怎么办呢?更改内容请参考:Python学习指南 正常情况下,当我们定义了一个class,创建了一个 ...
- 【WPF】如何把一个枚举属性绑定到多个RadioButton
一.说明 很多时候,我们要把一个枚举的属性的绑定到一组RadioButton上.大家都知道是使用IValueConverter来做,但到底怎么做才好? 而且多个RadioButton的Checked和 ...
- Knockoutjs实例 - 属性绑定(Bindings)之流程控制(Control flow)
一.foreach binding 使用此功能可以方便我们循环遍历输出某个数组.集合中的内容. (1).循环遍历输出数组 View Row Code 1 <script type="t ...
- grootJs的属性绑定指令
index6.html 绑定文本text gt-text="{属性名}" 绑定标签属性attr gt-attr="vm属性名称(标签属性,value表达式)" ...
- 控制文本和外观------Attr Binding(attr属性绑定)
Attr Binding(attr属性绑定) 目的 attr 绑定提供了一种方式可以设置DOM元素的任何属性值.你可以设置img的src属性,连接的href属性.使用绑定,当模型属性改变的时候,它会自 ...
- javascript . 04 匿名函数、递归、回调函数、对象、基于对象的javascript、状态和行为、New、This、构造函数/自定义对象、属性绑定、进制转换
匿名函数: 没有名字的函数,函数整体加小括号不报错, 函数调用 : a:直接调用 (function (){函数体}) ( ) ; b:事件绑定 document.onlick = functio ...
- angular 组件学习-组件内属性绑定
#组件内的属性(元素的属性)绑定(property binding) 应用场景:通过改变DOM元素的属性,动态显示/隐藏一个元素 知识点:HTML 属性与DOM属性的区别 改变HTMl属性,浏览器需要 ...
- LiveBindings --- 把对象之间的属性绑定起来
有了 FireMonkey 框架,它不同于 VCL ,以往的数据感知控件不能放在它上面,所以 XE2 提供了 LiveBindings 功能作为替代方案.另外它也是个通用的基础设施,同样可用于传统的V ...
- vue添加属性绑定
html <div id="app-2"> <span v-bind:title="message"> 鼠标悬停几秒钟查看此处动态绑定的 ...
随机推荐
- C# -- 推断字符能否转化为整形
int iNum = 0; string sNumber = "1003"; int iResult = 0; int.TryParse(sNumber, out iResult) ...
- EasyBCD在windows7基础上安装Ubuntu 14.04双系统详
把下载好的ubuntu安装包放在C盘根文件夹下,利用Daemon Tools 将安装包下casper文件夹的vmlinuz.efi和initrd.lz复制到C盘根文件夹下,紧接着打开easybcd,在 ...
- java语句顺序有时非常重要
我们学习java时,通常被告知,变量定义的顺序不重要,可是下面程序确在jdk 1.7上执行出错. public class FactoryImpl implements Serializable { ...
- RFC外部断点在在SAP退出后会失效
rfc外部断点系统退出后会删除吗? 不会删除Rfc外部断点在在SAP退出后标识还在, 但是断点会失效! 附 断点消息: ABAP 中的断点分为静态和动态两种.一. 静态断点(Static Break ...
- DeepLearningFlappyBird-深度学习玩游戏-1-环境搭建
-------------------------------------------------------------------------------------- https://githu ...
- eclipse输入提示 设置
- 搭建java运行环境
安装IDE 集成开发环境(IDE,Integrated Development Environment ) 1.安装jdk,jre(jdk自带jre),记住他们的安装位置. 2.配置环境变量.(JAV ...
- mysql优化-------Myisam与innodb引擎,索引文件的区别
Myisam与innodb引擎,索引文件的区别: innodb的次索引指向对主键的引用. myisam的次索引和主索引都指向物理行. myisam一行一行的插入,会产生一行一行的文件,磁盘上有数据文件 ...
- aop+自定义注解
自定义注解,并且实现,需要两个文件: 自定义注解类: package com.clc.server.annotation; import java.lang.annotation.ElementTyp ...
- IntelliJ IDEA 2017 反向代理工具新方法激活
来源:http://blog.lanyus.com/archives/317.html 反向代理工具, 可用于激活JRebel (win64) 1.点击进入 https://github.com/i ...