首页 > 编程语言 >【python】@property装饰器

【python】@property装饰器

时间:2023-12-08 10:56:16浏览次数:34  
标签:name python self value ._ property 装饰 def

@property

介绍:@property是一个内置的装饰器,用于将一个方法变成属性调用。让方法可以像实例属性那样进行访问,这样可以保证对象状态的封装性,同时,将数据的“获取”和“修改”集成到一处处理,提高代码的可读性和可维护性。

通过对比,解释@property的意义:

class Person:
    def __init__(self, name):
        self._name = name

p = Person("Alice")
print(p._name)  # Alice
p._name = "Bob"
print(p._name)  # Bob

这是一个非常简单的类,我们可以直接通过访问_name属性来获取及修改name。

但存在一些问题:
1.对于类的用户来说,他们并不应该需要关心名字是存储在_name这个属性中的,用户只关心自己能够获取及修改这个人的名字就可以了。如果有一天,我们想改变名字的存储方式,例如名字需要存成全大写,类的用户可能就需要修改他们的代码来适配这个变化。
2.我们无法对设置名字的操作做出限制。比如说,我们希望名字必须是一个非空字符串,但在目前的代码下用户是完全可以给人设置一个空字符串作为名字的。

看看如何用@property来解决上述问题:

class Person:
    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        if not value:
            raise ValueError("Name cannot be empty")
        self._name = value

p = Person("Alice")
print(p.name)  # Alice
p.name = "Bob"
print(p.name)  # Bob

此时的name就变成了一个对外的属性,而用户不再需要关心内部是如何存储的。同时,我们的类也可以自由地修改内部实现,同时不会影响到类的用户。同时,我们也可以在setter方法中,设定一些条件来限制设置的值。

即使有一天我们改变了名字的存储方式:

    @name.setter
    def name(self, value):
        if not value:
            raise ValueError("Name cannot be empty")
        self._name = value.upper()    #改为大写存储

类的用户像之前一样使用就可以了,不会受到影响。

总结来说,@property能够让我们更好的封装内部实现,对类用户提供更加简单清晰的接口,同时可以在需要的时候对设置的值做出限制。

标签:name,python,self,value,._,property,装饰,def
From: https://www.cnblogs.com/newasgard/p/17884681.html

相关文章

  • 高并发爬虫用Python语言适合吗?
    不管你用什么语言没在进行高并发前,有几点是需要考虑清楚的,;例如:数据集大小,算法、是否有时间和性能方面的制约,是否存在共享状态,如何调试(这里指的是日志、跟踪策略)等一些问题。带着这些问题,我们一起探讨下python高并发爬虫的具体案例。在Python中实现高并发爬虫,我们可以使用异步编程库......
  • python如何提取excel表格中的超链接
    importxlrddefget_wb(path):wb=xlrd.open_workbook(path)returnwbdefget_wb(path):wb=xlrd.open_workbook(path)returnwbdefget_hyperlink(wb,sheet_name,cell):worksheet=wb.sheet_by_name(sheet_name)hyperlink=worksheet.......
  • python将图片写入excel
    importjsonimportpandasaspdfromopenpyxlimportWorkbookfromopenpyxl.drawing.imageimportImageexcel_col_map={1:"A",2:"B",3:"C",4:"D",5:"E",6:"F&quo......
  • python学习笔记-tornado框架
    一、简单介绍tornadotornado学习概要1、基本操作 -路由系统 -视图函数2、自定义开源组件 session Form表单验证3、自定义异步非阻塞web框架1、简单示例importtornado.ioloopimporttornado.webclassMainHandle(tornado.web.RequestHandler):defget(self):......
  • Python 深拷贝和浅拷贝详解
    import logging 一、深拷贝和浅拷贝概念理解1、浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。2、深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和......
  • 聪明办法学python-12.4——12.8笔记打卡
     python中Debug的方法  必要性:在于程序可能出现不符合预期结果的情况 困难:在于bug的出触发原因多种多样,只能看到最终结果 调试代码的基本思路:让bug在设计时更容易暴露出来,包括利用print和断言来解决简单问题,利用IDE进行调试 常见的错误:函数未定义会报错,需要检查函数......
  • Python的hashlib模块
    一、什么是摘要算法1、摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)用于生成数据或文本的简短摘要或哈希值的算法。它们被广泛应用于密码学、数据完整性验证和信息检索等领域。摘要算法通过对输入数据进......
  • debug-聪明办法学Python
    如何Debug调试理论开始调试之前通过不断地调试,比如在循环中打印某个元素检查不得不承认机器永远只认编程语言不过你必须要时刻关注你的变量名称是否发生变更,这在大改前必须要注意的调试已知程序有bug,如何找到?调试困难的根本原因因为bug的触发经历了漫长的过程需求->设......
  • Python之的sys、os、subprocess、shutil 模块
    一、sys模块 sys模块是与python解释器交互的一个接口1、sys.argv() 在Python中,sys.argv是一个列表,它包含了命令行参数传递给Python脚本的参数值。sys.argv列表的第一个元素是脚本的名称,后面的元素是传递给脚本的参数。importsys#打印脚本名称print("脚本名称:",s......
  • python第五次学习笔记
    1.调试: 调试(debugging)是暂停正在运行的程序,并解决程序中出现的问题的过程。调试Python程序非常简单,Python调试器会设置条件断点,并一次执行一行代码。接下来我们将使用Python标准库中的pdb模块调试Python程序。2.调试技术: 我们可以使用多种方法调试Python程序,以下是调试......