Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python @property

Python @property

作者头像
Steve Wang
发布于 2021-12-06 08:12:51
发布于 2021-12-06 08:12:51
45700
代码可运行
举报
文章被收录于专栏:从流域到海域从流域到海域
运行总次数:0
代码可运行

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

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

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

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

将方法转化为同名属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
100
200
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python property属性 - 将方法转化为变量的故事
为什么需要m和n的数字,首先需要知道例如mysql的分页查询的sql:select * from table_name limit m,n
Devops海洋的渔夫
2019/06/02
8390
Python中property的使用技巧
既要保护类的封装特性,又要让开发者可以使用 对象.属性 的方式操作方法,@property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对 () 小括号。
忆想不到的晖
2021/04/04
1.5K0
四、类与对象(二)
保护对象的属性 如果有一个对象,当需要对其进行修改属性时,有2种方法 对象名.属性名 = 数据 ---->直接修改 对象名.方法名() ---->间接修改 为了更好的保存属性安全,即不能随意修改,一般的处理方式为 将属性定义为私有属性 添加一个可以调用的方法,供调用 1 class People(object): 2 3 def __init__(self, name): 4 self.__name = name 5 6 def getName(self):
酱紫安
2018/04/16
8510
Python3 与 C# 面向对象之~封装
原文:https://www.cnblogs.com/dotnetcrazy/p/9202988.html
逸鹏
2018/06/20
1.7K0
Python 类与继承
self参数用于对当前类中实例的引用,必须作为该类中任何函数的第一个参数,但可以不必命名为 self
回天
2023/04/25
8510
Python 类与继承
Python面向对象基础
当把number属性变成私有属性__number之后,无法直接访问得到,只能通过get_number和set_number两个函数访问__number属性。
职场亮哥
2020/10/10
1.2K0
Python面向对象基础
Python3中的特性-----Property介绍
在python 中 属性 这个 实例方法, 类变量 都是属性. 属性, attribute
我被狗咬了
2019/10/14
8160
Python - 面向对象编程 - @property
可以实现在不破坏类封装原则的前提下,让开发者依旧使用 对例对象.属性 的方式操作类中的属性
小菠萝测试笔记
2021/09/08
3200
Python 使用@property
首先是动态更新功能,类内加了@property装饰器的函数具备动态更新功能,类似于一种回调函数,只要函数内涉及的变量有变化,该函数就会执行回调,动态更新。 也是因为这种特性,所以@property修饰的可以理解为一个变量,动态更新的也是这个变量。 举个例子:
chaibubble
2020/03/19
5150
Python - 描述器
我们可以使用 Python 自带的 property 装饰器 来控制属性的访问,下面这个例子通过 property 控制了 Person 的 age 属性的访问和修改
小歪
2019/05/14
9390
Python 类对象和实例对象访问属性的区别、property属性
下面的一个小demo,定义了一个省份类  Province ,即类对象 Province ,开辟了一块内存空间,空间中存放着 类属性 country 和 __init__()方法 。
用户7886150
2020/12/20
4.4K0
trick(十六)、静态方法、类方法、属性方法
在类中的方法前面通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法
狼啸风云
2020/04/02
2.1K0
Python面向对象的魔术方法
在Python中,所有以__双下划线包起来的方法,都统称为魔术方法。比如最常见的 __init__ 。
职场亮哥
2020/10/10
8270
说说Python中的property
最近在项目中,发现项目越来越大之后,之前的编写方式会留下很多坑,因此最近专门研究了一下静态语言中的方法,比如java中的bean这玩意,发现这种方式引入后,可以很有效的解决这类问题。
点点寒彬
2020/03/18
5770
Python内置函数property()使用实例
class Shuxing(): def __init__(self, size = 10): self.size = size def getSize(self): print('getSize') return self.size def setSize(self, value): print('setSize') self.size = value def delSize(self):
用户1214487
2018/01/24
8110
@classmethod与@staticmethod以及属性函数@property
@classmethod @propery @staticmethod 装饰器
禹都一只猫olei
2018/12/27
9390
全面深入理解 Python 面向对象
注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。
用户8949263
2022/04/08
6620
全面深入理解 Python 面向对象
python--初始面向对象:类的相关知识,对象的相关知识
当然很简单,两个角色,1个人物,1个boss,且人物和boss都有不同的技能,比如人物用觉醒技能秒了boss,掉了xx装备,boss用大招秒了人物,人物死亡,怎么描述这种不同的人物和他们的功能呢
py3study
2018/08/02
4530
Python面试题之Python面向对象编程汇总
面向对象的设计思想是从自然界中来的,因为在自然界中,类(Class)和实例(Instance)的概念是很自然的。Class是一种抽象概念,比如我们定义的Class——Student,是指学生这个概念,而实例(Instance)则是一个个具体的Student,比如,Bart Simpson和Lisa Simpson是两个具体的Student。
Jetpropelledsnake21
2019/02/15
1.9K0
OOP 三大特性:封装中的 property
或许,读者也认为,Python 不能实现真正意义上的对象封装,从上一节内容已经看到,以单下划线开始的命名是“君子约定”,以双下划线开始的命名是“虚晃一枪”。如果来“真”的,Python 能行吗?
老齐
2022/01/04
5250
相关推荐
Python property属性 - 将方法转化为变量的故事
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验