使用__slots__限制实例的属性
1.给实例化的对象添加新的属性
看下面一段代码,然后给实例化的对象s添加或者修改属性
class Student(object):
name='china' s = Student()
s1=Student() s.name = 'Charles'
s.age=20
print s.name
print s1.name
print s.age 结果:
Charles
china
20
可以看到:实例的属性可以被修改或者添加
2、使用__slots__限制只有指定的属性才可以被实例添加
将可以被实例化的对象修改的属性添加到内置函数__slots__后面的元祖中,表示只有当属性存在于该元祖中时,该属性才可以在对象中被添加,但是不能修改(如果该属性已经存在于类中);
class Student(object):
__slots__=('name','age')
# gender='female'
# name='china'
# age = 30 s = Student()
s1=Student()
s.name = 'Charles'
s.age=20
print s.name # print s1.name
print s.age
# s.gender='male'
在上述代码中s/s1能够添加的属性只有name和age,但是,如果name或者age已经存在于Student类中,那么就不能再s/s1中添加了,否则会报属性错误;
3、在类的继承中使用__slots__限制实例化对象的属性
创建一个Primary_Student类,继承Student类,然后实例化Primary_Student
class Student(object):
__slots__=('name','age') class PrimaryStudent(Student):
pass
s2 = PrimaryStudent()
s2.name = 'eric'
s2.genger='male'
print s2.name
print s2.genger
上述代码显示正常
如果我们再在子类中定义__slots__方法呢?
class Student(object):
__slots__=('name','age') class PrimaryStudent(Student):
__slots__ = ('gender')
s2 = PrimaryStudent()
s2.name = 'eric'
s2.gender='male'
s2.grade=80
print s2.name
print s2.gender
上述代码在执行到s2.grade=80的时候报属性错误
好了,做到这儿,我们就可以总结一下了
1、类的属性(之前有教程叫做字段,只有包含@装饰器property的方法称为属性,这里就统一叫做属性吧),可以被实例化的对象添加新的属性以及修改属性的值;
2、可以使用__slots__方法,实现只有属性存在于该方法后面的元祖中的时候,在可以被对象添加,如果字段不存在于元祖中,那么该属性只能被对象访问;
3、如果在父类中存在__slots__方法,父类中__slots__对属性的限制不会继承到子类中,但是如果子类中也定义了__slots__方法,那么子类的属性的限制就会继承父类的__slots__,并加上子类的__slots__;
参考地址:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186739713011a09b63dcbd42cc87f907a778b3ac73000
使用__slots__限制实例的属性的更多相关文章
- Python—使用__slots__限制实例的属性
如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性. 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该 ...
- python3 - 使用__slots__限制实例属性
为了限制实例的属性,可以在定义class的时候,定义一个特殊的__slots__变量,来限制class实例能添加的属性.比如,只允许对Persion实例添加name 和 age 属性 class Pe ...
- Python使用__slots__限制实例属性
#定义一个类Student class Student(object): __slots__ = ('name','age') #用元组(tuple)的形式绑定属性名称 s = Student() s ...
- 使用__slots__限定实例的成员列表
使用__slots__限定实例的成员列表 默认情况下,python对象队象的每个实例(instance)都会有一个字典来存储该实例的属性,这样做的好处在于运行时期每个对象可以任意设置新的属性.而相对应 ...
- Python - 001 - 类与实例间属性的理解
Python是个很灵活的语言,光看它的类和实例间属性的访问机制就可以看出这一点,不过这一点还真的不好理解,做了些测试之后我的理解是这样的: 实例在访问class属性时,先检索自己的names, 如果有 ...
- Vue2.x源码学习笔记-Vue实例的属性和方法整理
还是先从浏览器直观的感受下实例属性和方法. 实例属性: 对应解释如下: vm._uid // 自增的id vm._isVue // 标示是vue对象,避免被observe vm._renderProx ...
- Vue(十二)vue实例的属性和方法
vue实例的属性和方法 1. 属性 vm.$el vm.$data vm.$options vm.$refs <!DOCTYPE html> <html lang="en& ...
- vue实例的属性和方法
vue实例的属性和方法 1. 属性 vm.$el #指定要绑定的元素 vm.$data #Vue 实例的数据对象 vm.$options #获取自定义属性的值 new Vue({ customOpti ...
- python进阶01 面向对象、类、实例、属性封装、实例方法
python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...
随机推荐
- maven的web项目和shiro集成的问题
在自定义shiro然后在加入spring的配置文件时,启动tomcat的时候一直报错 原因:刚学,对maven的依赖构建属性不熟悉 只是完成了maven父项目和子项目的依赖关系,并没有配置子项目之间的 ...
- 思考-Status management and validation(状态管理与验证)
结合自己的项目,有这么一个模块,这个模块用来添加一个停车场,注册信息又分:基本信息,管理设置,管理员设置3部分组成,每部分都有input=text的输入框,点击保存按钮需要验证各个部分的输入框是否有合 ...
- 文本adversarial examples
对文本对抗性样本的研究极少,近期论文归纳如下: 文本对抗三个难点: text data是离散数据,multimedia data是连续数据,样本空间不一样: 对text data的改动可能导致数据不合 ...
- VS2008自定义快捷键设置
点[Keyboard..]
- CSS的4种定位方式比较
CSS有四种定位(Positioning)方法:Static,Relative, Absolute和Fixed 元素flow, overlap 相对参照物: 能否用offset( top, left, ...
- MyBatis Generator 生成数据库自带中文注释
1. maven依赖 <!-- mybatis生成 jar包 --> <dependency> <groupId>org.mybatis.generator< ...
- C# WPF 进度条,根据读取数据显示进度条进度,根据Excel文件读取数据,进度条样式
后台代码: //导入 private void Border_MouseLeftButtonUp_2(object sender, MouseButtonEventArgs e) { var path ...
- 使用Eclipse编译运行MapReduce程序 Hadoop2.6.0_Ubuntu/CentOS
使用Eclipse编译运行MapReduce程序 Hadoop2.6.0_Ubuntu/CentOS 2014-10-10 (updated: 2016-05-22) 64246 153 本教程介绍 ...
- Shell 格式化输出数字、字符串(printf)
1.语法 printf打印格式字符串,解释'%'指令和'\'转义. 1.1.转义 printf使用时需要指定输出格式,输出后不换行. printf FORMAT [ARGUMENT] printf O ...
- docker unbuntu 32-bit 更新apt-get
1.vi /etc/apt/sources.list deb http://mirrors.aliyun.com/debian wheezy main contrib non-free deb-src ...