__slots__ 限制实例属性的绑定
我们上一篇学了,实例可以随意绑定属性变量甚至方法,当然类也可以随意绑定属性变量和方法,但是,实例绑定的属性和方法,只能针对当前实例适用,其他类的实例无法进行访问:
如果想要其他实例访问到我们绑定的属性或者方法,根据上一篇讲的,我们通过给类绑定就好了,这样,其他实例均可以访问的到:
#!/usr/bin/env Python3
# -*- encoding:UTF-8 -*-
import types
class Student(object):
pass
def hello(self,name):
print('hello ,',name)
Student.my_hello = types.MethodType(hello,Student) #为类Student绑定一个my_hello方法,方法指向hello
m=Student()
n=Student()
m.my_hello('Appleyk')
n.my_hello('Kobe')
我们通过types模块里面的MethodType,为类Student指定一个函数hello,并把这个hello绑定到类Student的一个新方法my_hello,当然我们也可以为实例这样做,我们看下执行结果:
Python如此灵活,静态语言Java和C#不能这样做吧,在Python中,如果我们想要给已定义好的类增加一个新功能,我们可以通过额外的给类绑定一个函数实现,当然,我们也可以自私的只给我们当前使用的实例绑定一个新功能。
回到本篇所讲,在Python中,有一个特殊变量__slots__,这个变量是干嘛的呢?它的作用是限制一个类中实例的属性绑定,我们看如下demo:
__slots__.py:
#!/usr/bin/env Python3
# -*- encoding:UTF-8 -*-
class Student(object):
__slots__ = ('name','sex')
s = Student()
s.name = 'Appleyk'
s.sex = '男'
print(s.name)
print(s.sex)
我们目前,给实例s只绑定了两个属性name和sex,且这两个属性和特殊变量__slots__的值(一个tuple元组,元素为限定只能绑定的属性)相等,我们执行一下demo:
没问题,如果我们再给实例s绑定一个属性score,会怎么样?
当然,这种特殊的限制绑定属性的方式,只针对当前类的实例,如果,发生在子类的实例身上,则这个限制无效:
如果,子类也想限制实例的属性绑定,和父类一样,需要在子类中也定义一个__slots__特殊变量,这样,子类允许定义的属性就是自身的__slots__加上父类的__slots__。
本篇结束!