前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python @property

Python @property

作者头像
Steve Wang
发布2021-12-06 16:12:51
4270
发布2021-12-06 16:12:51
举报
文章被收录于专栏:从流域到海域

prerequisite: Python装饰器 在面向对象编程中,我们通常希望一个类的属性具有一定程度的封装性,其他对象只能通过定义好的接口访问这些属性,而不能够随意修改。Java里面体现在getter和setter两个方法。

在Python中如果我们不希望类的方法被修改,可以使用@Property装饰器。它可以修饰方法,将该被修饰的方法转为相同名称的只读属性;也可以与属性配合使用,来防止属性被修改

@Property装饰器常见使用场景有两个:

  1. 将方法转化为同名属性
  2. 与类的属性配合使用,防止属性被修改

将方法转化为同名属性

代码语言:javascript
复制
class Data:
    @property
    def printnum_with_property(self):
        return 100
    def printnum_without_property(self):
        return 100

data = Data()
print(data.printnum_without_property())
print(data.printnum_with_property)
print(data.printnum_with_property())

结果:

代码语言:javascript
复制
100
100
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-58eda0e50ce8> in <module>
      9 print(data.printnum_without_property())
     10 print(data.printnum_with_property)
---> 11 print(data.printnum_with_property())

TypeError: 'int' object is not callable

注:一个方法被@property修饰之后,就变成了属性,不能在通过对象名.方法名()访问到,只能是使用访问属性的方法即对象名.方法名来访问。

防止属性被修改

代码语言:javascript
复制
class Data(object):
    def __init__(self):
        self._count = 100
    @property
    def count(self):
        return self._count

data = Data()

print(data.count)
data.count = 200
print(data.count)

注:self._count中的下划线可以不加,语法上也没有错误,但这种写法强调来_count是类的一个固有属性,是推荐写法。

结果如下:

代码语言:javascript
复制
100
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-38f5dc4a3fc6> in <module>
      9 
     10 print(data.count)
---> 11 data.count = 200
     12 print(data.count)

AttributeError: can't set attribute

注:data._count依然能被访问和更改。

代码语言:javascript
复制
class Data(object):
    def __init__(self):
        self._count = 100
    @property
    def count(self):
        return self._count

data = Data()

print(data.count)
data._count = 200
print(data.count)

结果如下,不会报错:

代码语言:javascript
复制
100
200
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 将方法转化为同名属性
  • 防止属性被修改
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档