__slot__ 限制

算法弦歌
• 阅读 1551

限制__slot__

上一篇有提到通过动态绑定:在类外部定义方法,然后动态地给类加上新的功能,使得类的实例都能调用外部方法。
但如果要限制实例的属性,不允许动态地添加,该怎么办呢?

为了达到限制的目的,python允许在定义class的时候,定义一个特殊的 slots 变量,来限制该class实例动态添加属性。
那使用__slot__的好处呢?

  • 防止用户随意动态增加实例属性;
  • 节约内存,因为动态绑定时属性存储在__dict__中;
  • 更快的属性访问速度。

例如:只允许对Student实例添加 name 和 age 属性。

>>> class Student(object):
...      __slots__ = ('name','age')    # 使用tuple定义允许绑定的属性名称
>>> s = Student()                      # 创建新的实例
>>> s.name = 'xlp'                     # 绑定属性name
>>> s.age = 24                         # 绑定属性age 
>>> s.score = 99                       # 绑定属性score

# 但是score没有放到__slots__中,所以不能绑定score属性,报错。
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'

!!!但是__slots__定义的属性只对当前类的实例起作用,对继承的子类是不起作用的。除非在子类中也定义__slots__
这样子类实例允许定义的属性就是自身的__slots__ + 父类的__slots__ 限定的属性。
例如:

>>> class SStudent(Student):
...     __slots__ = 'gender'
...
>>> g = SStudent()
>>> g.name = 'xxx'
>>> g.score = 99                # 子类依旧可以动态绑定属性
>>> g.gender = 'Female'
>>> g.teacher = 'Mrs. Wang'    # 不允许绑定咯~
Traceback (most recent call last):
 File "<input>", line 1, in <module>
AttributeError: 'SStudent' object has no attribute 'teacher'

子类SStudent除掉可以绑定name、age,还可以绑定定义在子类__slot__中的gender属性。
但是teacher属性没有在__slot__限制中,故不能动态绑定,会报错。


❤ thanks for watching, keep on updating...
点个赞再走吧

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
4年前
java中多态的实现机制
多态的概念:  简单来说就是事物在运行过程中存在的不同状态,即父类或接口定义的引用变量指向子类或具体实现类的实例对象。程序调用方法在运行期才进行动态绑定,而不是引用变量的类型中定义的方法。多态存在的前提:1、存在继承关系,子类继承父类;2、子类重写父类的方法;3、父类引用指向子类对象。具体实例:1、定义一个父类:Animal
Irene181 Irene181
4年前
一篇文章带教会你Python访问限制那些事儿
一、前言在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。二、案例分析以Teacher类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性。classTeacher(object):definit(self,name,score):s
Easter79 Easter79
4年前
swift下标脚本和extension扩展
一.类的下标方法类、结构体和枚举可以定义下标,它可以作为访问集合、列表或序列成员元素的快捷方式。可使用下标通过索引值来设置或检索值而不需要为设置和检索分别使用实例方法。可以为一个类型定义多个下标,并且下标会基于传入的索引值的类型选择合适的下标重载使用。下标没有限制单个维度,你可以使用多个输入形参来定义下标以满足自定义类型的需求。下标脚本允许通过
lzy lzy
4年前
RPC框架手撕之路---java反射以及动态代理机制
在上一篇文章中,我们提到了,RPC框架所需要的java基础,第一点就是java的动态代理机制,动态代理机制的基础是反射,无论是在实际编程或者是面试时,都是java知识的重中之重。java反射:定义:在运行状态中,对于任意一个类,都能够知道这一个类的所有属性和方法,对于任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息以及动态调用类方法
Stella981 Stella981
4年前
Python中的@函数装饰器到底是什么?
在解释@函数装饰器之前,先说一下,类中的类方法和静态方法。在Python中完全支持定义类方法、静态方法。这两种方法很相似,Python它们都使用类来调用(ps:用对象调用也可以)。区别在于:Python会自动绑定类方法的第一个参数,类方法的第一个参数会自动绑定到类本身;但对于静态方法则不会自动绑定。类方法用@classmethod
Easter79 Easter79
4年前
Struts2.5版本方法无法使用通配符问题
问题:在struts2.5中如果使用方法通配符,是无法进行方法调用的:<actionname"login_"class"loginAction"method"{1}".............</action因为从2.3开始在package元素中增加了一个属性,为了限制DMI的方法访问:<pa
Wesley13 Wesley13
4年前
JAVA设计模式之单例设计模式
    单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。  在JAVA中实现单例,必须了解JAVA内存机制,JAVA中实例对象存在于堆内存中,若要实现单例,必须满足两个条件:  1.限制类实例化对象。即只能产生一个对象。
Stella981 Stella981
4年前
Python Day24:类的继承、派生、覆盖、super()、绑定、非绑定方法
类的继承、派生、覆盖、super()python类的继承:子类继承父类,只需要在定义类的时候在类名后面加上(父类名)。继承之后,父类的属性方法、子类都可以访问派生:子类继承父类后,自己在父类的基础上,又添加了一些属于自己特性的属性、方法
Stella981 Stella981
4年前
Mixin研究之一
如何利用Mixin对已定义的类进行方法和属性扩展起因类已经定义明确,但希望在创建实例时拓展实例的功能,这种情况下怎么办?目的实现一种机制,能够根据一定的规则,在实例创建时动态的拓展实例的功能(方法和属性);实现1.动态的拓展类的方法和属性,这样所有实例
Stella981 Stella981
4年前
Category 特性在 iOS 组件化中的应用与管控
背景iOSCategory功能简介Category是ObjectiveC2.0之后添加的语言特性。Category就是对装饰模式的一种具体实现。它的主要作用是在不改变原有类的前提下,动态地给这个类添加一些方法。在ObjectiveC(iOS的开发语言,下文用OC代替)中的具体体现为:实例(类)方法、属性和协
小万哥 小万哥
1年前
C++ 类方法解析:内外定义、参数、访问控制与静态方法详解
C类方法类方法,也称为成员函数,是属于类的函数。它们用于操作或查询类数据,并封装在类定义中。类方法可以分为两种类型:类内定义方法:直接在类定义内部声明和定义方法。类外定义方法:在类定义内部声明方法,并在类外部单独定义方法。类内定义方法在类定义内部可以直
算法弦歌
算法弦歌
Lv1
日日望乡国,空歌白苎词。
文章
4
粉丝
0
获赞
0