一、属性装饰器
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方法。
③ 属性装饰器的原理:本质上就是调用对应事先设置好的方法,通过方法返回属性值或者设置属性值。