property()的官方的说法将类的实例指派给另一个类的属性,它的作用把方法当作属性来访问,从而提供更加友好访问方式。

示例代码:

class C(object):
    """docstring for."""
    def __init__(self):
        self._x =None
    def getx(self):
        return self._x
    def setx(self,value):
        self._x=value
    def delx(self):
        del self._x
    x=property(getx,setx,delx,"my")
c =C()
c.x =4
print(c.x)

c.getx()
#4

如上所述:property() 返回一个可以设置属性的属性,第一个参数是获得属性的方法名(例子中是 getx),第二个参数是设置属性的方法名(例子中是 setx),第三个参数是删除属性的方法名(例子中是 delx)。

上述例子,我们提供了设置属性的方法,setx 与获取属性的方法getx,以及删除属性的方法 delx。如果我们某天需要改程序,对应接口名也要跟着改,这样就比较麻烦了。我们通过property(),为用户只提供x属性,通过 x 属性设置、获取值即可!

使用属性修饰符创建描述符:

Python内置的@property装饰器,可以让我们实现用类似属性的方式访问类变量

示例:

class B(object):
    """docstring for ."""

    def __init__(self):
        self._y=None
    @property
    def y(self):
        '''我是y的property '''
        return self._y
    @y.setter
    def y(self,value):
        self._y=value
    @y.deleter
    def y(self):
        del self._y
b=B()
b.y =4
print(b.y)
# 4

注意:三个处理_y属性的方法名要相同(参数不同)。

通过类实例b.y可以直接设置属性,*(b.y =4 实际转化为 b.set_y(4)) *在设置属性方法中,我们可以添加条件判断,当不符合时直接抛出异常。

把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作。

扩展:我们还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性

class Student(object):
    """docstring for ."""
    @property
    def birth(self):
        return self._birth
    @birth.setter
    def birth(self,value):
        self._birth =value
    @property
    def age(self):
        return self._birth
s=Student()
s.birth=2000
print(s.age)
s.age =2
#AttributeError: can't set attribute

上述代码,age为只读属性,因为没有设置setter方法,当试图赋值时,抛出异常。


Leave Your Comment

电子邮件地址不会被公开。 必填项已用*标注