Python学习之使用__slots__限制绑定的属性

属性的动态绑定以及限制绑定

对于一个类所创造出的实力我们可以使用动态的方式进行属性的绑定。即如下:

class Human(object):

这样的上述类没有添加任何属性,但是可以使用动态绑定的方法:
one = Human()
one.name = "夸父" //绑定了一个name属性
...       

可以使用如上的方式绑定很多属性,那么如果我们想要限制动态绑定的一些属性呢,比如只能绑定name和age,不能够绑定其他的属性。想要实现这样的需求就要用到如下的方式:

class Human(object):
    __slots__ = ('name','age') //只能动态绑定name和age

//我们尝试一下
>>> two = Human()
>>> two.name = 'MJ'
>>> two.age = 23
>>> two.hobby = 'Work'
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    two.hobby = 'Work'
AttributeError: 'Human' object has no attribute 'hobby'
>>> 

可以很清楚的看到,当我们想要绑定指定属性之外的属性时,出现了错误。

slots(前后有两个下划线__)会不会影响类init方法中绑定的属性

测试代码如下:

>>> class Human(object):
    __slots__ = ('name',"age")
    def __init__(self,hobby):
        self.hobby = hobby

>>> three = Human('work')
Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    three = Human('work')
  File "<pyshell#19>", line 4, in __init__
    self.hobby = hobby
AttributeError: 'Human' object has no attribute 'hobby'

可以看到,我们在slots总指定了"name"和"age"没有指明"hobby",而当我们使用初始化方法创造实例对象时失败并报错了。因此slots会影响init方法中绑定的属性。

注意

使用slots只会影响当前的类,并不会影响子类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,801评论 19 139
  • 20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...
    iOS_恒仔阅读 6,874评论 1 6
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 5,514评论 0 6
  • 定义类并创建实例 在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类...
    绩重KF阅读 9,423评论 0 13
  • 百无一用是我了。我不厌世,这世界也不厌恶我,只是没关注不知晓而已。
    安顾留白阅读 1,580评论 0 0

友情链接更多精彩内容