Python系列教程(四十一):类的属性装饰器property

  一、属性装饰器  

1、实例的属性的一般设计

    一般设计一个类的时候,要把实例的属性保护起来,不让外部直接方法或者修改,而是通过提供一个接口,也就是通过实例去调用对应的方法去获取或者修改一个实例的属性。

class Person():
    def __init__(self, first_name, last_name):
        self.__first_name = first_name
        self.__last_name = last_name

    def get_name(self):
        return "{} {}".format(self.__first_name,self.__last_name)
    
    def set_name(self,first_name, last_name):
        self.__first_name = first_name
        self.__last_name = last_name
        
>>> A = Person("shuang","jimmy")        

#通过方法去获取实例属性        
>>> A.get_name()        
'shuang jimmy'        

#通过方法去修改实例属性
>>> A.set_name("ku","jimmy")        
>>> A.get_name()        
'ku jimmy'

2、property属性装饰器

    这种通过方法来访问或者修改实例属性的用法还是非常常见的,索性Python就提供了一种更加简便的方法来访问和修改实例属性,这就是property属性装饰器,使用它可以把一个方法作为属性来用,就是调用的时候不需要使用小括号,简便的同时又能保护实例属性不被乱改,它有两种使用方法。

  方法1:@property属性装饰器  

class C(object):
    def __init__(self,first_name, last_name):
        self.__first_name = first_name
        self.__last_name = last_name

    @property
    def name(self):
        """I'm the 'name' property."""
        return "{} {}".format(self.__first_name,self.__last_name)

    @name.setter
    def name(self, value):
        self.__first_name = value[0]
        self.__last_name = value[1]
        
    @name.deleter
    def name(self):
        del self.name
        
>>> c = C("shuang","jimmy")        

#使用属性的访问方式来获取属性值
>>> c.name
'shuang jimmy'  

#使用属性的赋值方式来设置属性值
>>> c.name = ["ku","jimmy"]  
>>> c.name    
'ku jimmy'

    使用说明和注意要点:

    ① 一个属性如果要实现可访问、设置、删除的功能,一般是通过添加对应的方法getter、setter、deleter来实现。

    ② 使用property装饰器的第一步就是,在getter方法上添加属性装饰器@property,它的作用就是可以让实例,以属性的方式代替方法的调用方式来获取属性值,而实际的原理其实就是自动调用getter方法。

    ③ 调用 实例.getter_name(属性)等价于 实例.getter_name()(方法),实例.getter_name的值就是getter_name()方法的返回值,如上面例子中,c.name 等价于 c.name()。

    ④ 而setter和deleter的方法,是当给属性赋值或者删除属性时,会自动调用对应的方法。如上面例子中,c.name = xxxx 等价于setter的c.name(xxx)。

    ⑤ 一般setter方法只接收一个参数,因为在属性赋值的时候,就只能赋一个值。

    ⑥ getter、setter、deleter的方法名必须是同名的。

    ⑦ getter使用@property装饰器,而setter和deleter分别使用:@方法名.setter和@方法名.deleter装饰器。

    ⑧ 如果要使用@property装饰器,getter方法是必须有的,而setter和deleter则可以省略,如果省略,则表示这个只是一个只读属性,不能进行修改。

  方法2:property(getter, setter, deleter, doc = None) 

class D(object):
    def __init__(self,first_name, last_name):
        self.__first_name = first_name
        self.__last_name = last_name

    def get_name(self):
        """I'm the 'x' property."""
        return "{} {}".format(self.__first_name,self.__last_name)

    def set_name(self, value):
        self.__first_name = value[0]
        self.__last_name = value[1]

    name = property(get_name, set_name)
    
>>> d = D("shuang","jimmy")

#使用属性的访问方式来获取属性值,实际上是调用get_name方法
>>> d.name    
'shuang jimmy'    

#使用属性的赋值方式来设置属性值,实际上是调用set_name方法
>>> d.name = ['huang','sherlock']
>>> d.name
'huang sherlock'

    使用说明和注意要点:

    ① 通过property类实例化对象来实现@property一样的功能。

    ② property类实例化接收3个参数,分别也是对应getter、setter、deleter方法名称

    ③ 在外部是通过property这个类的实例化对象,来实现属性的访问、修改和删除操作。

3、属性装饰器使用总结

    ① 属性property有两种使用方法:@property装饰器和property(getter,setter,deleter)方法

    ① 属性装饰器的作用:以属性的操作方式代替方法的调用,属性的访问就是调用getter方法,属性的赋值就是调用setter方法。

    ③ 属性装饰器的原理:本质上就是调用对应事先设置好的方法,通过方法返回属性值或者设置属性值。

Jimmy's Blog ,版权所有丨如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:https://www.xjimmy.com/python-41-property.html

Leave a Comment