使用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
在使用的时候直接: 对象.属性名 、对象.属性名 = 什么什么 。