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

来源:互联网 发布:弹簧计算软件在线 编辑:程序博客网 时间:2024/05/29 08:12

使用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.age22

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

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

重点来了:

但是,如果我们想要限制实例的属性怎么办?比如,只允许对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():@propertydef score(self):    return self._score@score.setterdef 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
原创粉丝点击