资讯专栏INFORMATION COLUMN

__slot__ 限制

lavnFan / 1093人阅读

摘要:限制上一篇有提到通过动态绑定在类外部定义方法,然后动态地给类加上新的功能,使得类的实例都能调用外部方法。这样子类实例允许定义的属性就是自身的父类的限定的属性。但是属性没有在限制中,故不能动态绑定,会报错。

限制__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 "", line 1, in 
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 "", line 1, in 
AttributeError: "SStudent" object has no attribute "teacher"

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


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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44978.html

相关文章

  • 如何优化Python占用的内存

    摘要:概述如果程序处理的数据比较多比较复杂,那么在程序运行的时候,会占用大量的内存,当内存占用到达一定的数值,程序就有可能被操作系统终止,特别是在限制程序所使用的内存大小的场景,更容易发生问题。下面我就给出几个优化占用内存的几个方法。 概述 如果程序处理的数据比较多、比较复杂,那么在程序运行的时候,会占用大量的内存,当内存占用到达一定的数值,程序就有可能被操作系统终止,特别是在限制程序所使用...

    ThreeWords 评论0 收藏0
  • 4-面向对象编程

    摘要:声明对象构造函数,创建实例需要用到访问限制封装性是面向对象的一大特点,如果要内部属性不被外部调用,需要加上两个下划线这样就没办法直接通过实例来访问这个变量了因为这个时候,变量已经被隐式的变成了继承继承的一般写法为所有的类都继承于这个类。 包 python中包的引用是一个坑,经常出现这个文件夹的代码,引用不到另一个文件夹的代码,这个时候就必须要去更改环境变量,无论如何,总感觉不是一种优雅...

    LancerComet 评论0 收藏0
  • Python 面向对象

    摘要:构造函数构造函数参数列表在使用类创建对象时自动调用。类是从一堆对象中抽取相同的属性及方法得出的,抽象类就是从一堆类中抽取相同的属性及方法得出的。抽象类不能实例化对象。 1.构造函数 构造函数:__init__(参数列表) :在使用类创建对象时自动调用。注意:如果自己不写构造函数,系统默认也会加上一个空的构造函数。对象属性的优先级高于类属性,当对象调用属性时,如果有对象属性时,先获取对...

    jifei 评论0 收藏0
  • 流畅的python读书笔记-第九章-符合Python风格的对象

    摘要:以便于用户理解的方式返回对象的字符串表示形式。函数会调用函数,对来说,输出的是一个有序对。此外,还有用于支持内置的构造函数的方法。可散列实现了方法,使用推荐的异或运算符计算实例属性的散列值私有属性最好用命名规则来实现这种方式有好有坏 绝对不要使用两个前导下划线,这是很烦人的自私行为。——Ian Bicking 对象表示形式 repr()  以便于开发者理解的方式返回对象的字符串表示形式...

    fai1017 评论0 收藏0
  • Python学习之路28-符合Python风格的对象

    摘要:本篇继续学习之路,实现更多的特殊方法以让自定义类的行为跟真正的对象一样。之所以要让向量不可变,是因为我们在计算向量的哈希值时需要用到和的哈希值,如果这两个值可变,那向量的哈希值就能随时变化,这将不是一个可散列的对象。 《流畅的Python》笔记。本篇是面向对象惯用方法的第二篇。前一篇讲的是内置对象的结构和行为,本篇则是自定义对象。本篇继续Python学习之路20,实现更多的特殊方法以让...

    Eric 评论0 收藏0

发表评论

0条评论

lavnFan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<