属性的动态绑定以及限制绑定
对于一个类所创造出的实力我们可以使用动态的方式进行属性的绑定。即如下:
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只会影响当前的类,并不会影响子类。