限制属性绑定
当我们定义了一个类后,我们可以给实例绑定一个属性,就算是类里面没有定义也是可以的,就像是这样:
image.png
然后我们还是同样可以绑定一个方法:
def test(self):
print("test...")
from types import MethodType
human.test = MethodType(test, human)
human.test()
------
test...
我们是只给一个实例绑定了一个方法,所以是只对这一个实例有效。如果我们想给每一个实例都绑定那么不用说就是给类绑定方法,我们先看一下给类绑定对象:
def test_class(self):
print("now test class...")
Human.test_class = test_class
然后来看一下我们上面所创建的第一个实例human有这个方法吗?:
human.test_class()
------
now test class...
同时我们再新建一个实例看一下:
human1 = Human()
human1.test_class()
------
now test class...
也是可以的。
那么如果我们想要限制属性绑定怎么办?为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class实例能添加的属性:
class Human(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
现在你的实例是只可以绑定这两个属性了,如果绑定其他的就会报错:
human.sex = "Boy"
huma.sex
------
NameError Traceback (most recent call last)
<ipython-input-26-0c9130d826b3> in <module>
1 human.sex = "Boy"
----> 2 huma.sex
NameError: name 'huma' is not defined
使用slots要注意,slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的,除非在子类中也定义slots,这样,子类实例允许定义的属性就是自身的slots加上父类的slots。
使用@property装饰器
我们先定义一个类,类里面有一个年龄的私有属性,通过初始化设置年龄:
class Student(object):
def __init__(self, age):
self.age = age
按照之前的方法,我们可以使用“get/set”来获得它的值和修改它的值,这样是不是有点不方便,如果想要很简单的操作能不能呢?而且人的年龄是有限制的啊,不能小于0大于500(目前还没有发现超过500岁的人吧),所以如果在设置年龄的时候能不能有所限制呢?是可以的,我们可以通过装饰器来实现。
class Student(object):
def __init__(self, age):
self.age = age
@property
def age(self):
return self._age
@age.setter
def age(self, age):
if not isinstance(age, int):
raise ValueError('score must be an integer!')
if age < 0 or age > 500:
raise ValueError('age must between 0 ~ 500!')
self._age = age
s = Student(20)
s.age
------
20
然后我们通过使用“.”来修改
s.age = 30
s.age
------
30
在这个程序里面,你会发现一个细节,那就是我们在return的时候使用另外一个变量名来命名的,如果不这样做,你会发现会报错。
网友评论