python学习笔记1:面向对象的高级特性1__slots__

1.使用slots(第一次写博客下划线打不出来,请看代码):
python是一种动态语言,在正常情况下,我们定义一个类,再创建一个类的实例,我们在运行代码的时候,可以通过给这个实例绑定一个属性或者一个函数来增加这个实例的功能,如下面的例子:

class Dog(object):
    pass

def set_name(self,dogname):
    self.dogname = dogname
#注意set_name函数不是Dog类的函数


#为dog1这个实例绑定一个 gender属性
dog1 = Dog()
dog1.gender = 'male'
print(dog1.gender)

#为dog1这个实例绑定一个set_name方法
from types import MethodType
dog1.set_name = MethodType(set_name, dog1)
dog1.set_name('XiaoBai')
print('狗1的名字是', dog1.dogname)


'''我们只是为dog1这个实例绑定了新的属性和方法,
        所以对Dog这个类的其他实例没有上述绑定的属性和方法'''
dog2 = Dog()
try:
    dog2.set_name('XiaoHei')
except AttributeError:
    print('Dog2没有set_name这个方法!')

#给Dog类绑定set_name()之后,所有实例都有了set_name这个方法
Dog.set_name = set_name
dog2.set_name('XiaoHei')
print('狗2的名字是', dog2.dogname)

运行结果:

male
狗1的名字是 XiaoBai
Dog2没有set_name这个方法!
狗2的名字是 XiaoHei
>>> 

上面的例子可以看出动态语言的特性,所以又有了新的问题,有时候我们需要限制类的动态绑定怎么办?可以使用slots:

class Dog(object):
    __slots__ = ('name', 'age')

dog1 = Dog()
dog1.name = 'XioaBai'
dog1.age = 13
print('狗的名字:', dog1.name)
print('狗的年龄:', dog1.age)
try:
    gender = 'male'
    dog1.gender = gender
    print('狗的性别:', dog1.gender)
except AttributeError:
    print('不能给dog1绑定gender这个属性')

运行结果:

狗的名字: XioaBai
狗的年龄: 13
不能给dog1绑定gender这个属性
>>> 

还有需要注意的地方就是:
这个类的子类如果没定义slots,没有这个绑定限制,但是当子类也定义了slots, 则子类的绑定限制范围是子类的范围加上父类的范围。
ps:不要将slot写成slot,否则没作用,还有就是slots两边都有双下划线,第一次写博客打不出来
-_-!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值