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

本文详细介绍了Python中的属性装饰器@property及其使用方法,包括如何通过属性装饰器实现属性的访问、设置和删除功能。通过示例代码展示了两种使用@property的方式,一种是使用@property、@setter和@deleter装饰器,另一种是通过property()函数。属性装饰器的主要作用是将方法伪装成属性调用,同时保护实例的内部属性不被直接修改,增强了代码的封装性和安全性。
摘要由CSDN通过智能技术生成

一、属性装饰器

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方法。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值