使用__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.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...
随机推荐
- mysql空间类型使用笔记
创建表,填充测试数据 create table geom1(id int not null auto_increment primary key,geo geometry); )); )); sele ...
- webpack实现scss编译配置
1.webpack.start.js: var webpack = require('webpack'); var SpritesmithPlugin = require('webpack-sprit ...
- jmx - first demo
1. pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://ww ...
- MapReduce的工作机制
<Hadoop权威指南>中的MapReduce工作机制和Shuffle: 框架 Hadoop2.x引入了一种新的执行机制MapRedcue 2.这种新的机制建议在Yarn的系统上,目前用于 ...
- mint-ui 输入框按下按键执行查询
环境:vue.mint-ui 功能:一个输入框,按下按键之后就执行某个功能. 截图:一个输入框 输入框html: <mt-search v-model="query" can ...
- studio2.3app签名打包安装失败,找不到签名证书。
Androidstudio升级到2.3后,打包时和之前不一样了. 如果只选择V2,是未签名的.所以要把V1和V2都打勾.
- ThinkPHP5调用PHPExcel类实现导入导出
注意:extend是放置第三方类的地方,不要乱配置命名空间那些,引起不必要的类错误 代码如下 <?php namespace app\index\controller; use think\Co ...
- CF235C Cyclical Quest(SAM)
/* 统计串的出现次数显然可以在自动机上匹配出来即可 但是每次都挨个匹配的话会时间爆炸 那么考虑我们把串复制一份, 然后一起在后缀自动机上跑, 当我们匹配长度大于该串长度的时候强行失配即可 可能会有旋 ...
- hive使用map字段
create table role_bigtable(table_name string, record_date string, server_id string, map_col map<s ...
- es6(15)--generator
//generator处理异步,下一步用next,遇到return或者yied就会停止 { //generator基本定义 let tell=function* (){ yield 'a'; yiel ...