Python3 基础:面向对象高级编程(上)

使用slots

在Python中,我们可以动态的为类和对象绑定属性和方法。
给实例绑定属性和方法:

# 为实例绑定属性 name
>>> class People():
...     pass
... 
>>> p = People()
>>> p.name = 'kd'
>>> p.name
'kd'
>>> print(p.name)
kd

# 为实例绑定方法
>>> def setAge(self,age):
...     self.age = age
... 
>>> from types import MethodType
>>> p.setAge = MethodType(setAge,p)
>>> p.setAge(22)
>>> p.age
22

但是,给一个实例绑定的方法,对另一个实例是不起作用的。我们可以给class绑定,这样所有的实例都可以访问了。

People.setAge = setAge
>>> p.setAge(23)
>>> p.age
23

重点来了:

但是,如果我们想要限制实例的属性怎么办?比如,只允许对People实例添加name和age属性。
为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:

class People(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

就上面这个例子来说,如果绑定其他参数,则会报错 AttributeError 。
使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的。除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__

使用@property

Python内置的 @property 装饰器就是负责把一个方法变成属性调用的。

class Student():

@property
def score(self):
    return self._score

@score.setter
def score(self,v):
    if not isinstance(v,int):
        raise ValueError('parameters type wrong!')
    if v < 0 or v > 100:
        raise ValueError('must between 0 ~ 100')
    self._score = v

在使用的时候直接: 对象.属性名 、对象.属性名 = 什么什么 。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

outer199

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值