Python3学习(23)--__slots__ 限制实例属性的绑定

来源:互联网 发布:手机自定义抽奖软件 编辑:程序博客网 时间:2024/06/03 22:32

__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方法,方法指向hellom=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__特殊变量。



本篇结束!





阅读全文
0 0
原创粉丝点击