Python property、setter、deleter

面向对象封装特点之一就是通过实现好的方法来访问,限制对数据的不合理访问,把对象状态私有化,仅供类的内部进行操作

下方示例,Test方法的number属性类实例的时候传递1,number是一个公开属性,可以在外部任意修改、访问,没有对属性进行进行约束

class Test:
  def __init__(self,number)
  	self.number = number

if __name__ == '__main__':
  test = Test(1)
  print(test.number)
  test.number = -100
  print(test.number) 
@property

@property的作用是声明一个只读属性,在函数上装饰,像调用属性一样的去调用这个函数,对象.属性的方式操作,内部可以做一些逻辑判断,需要注意的两点

  • 调用被装饰方法的时候不+括号
  • 方法定义有且只能有self一个参数
class Test:
    def __init__(self, number):
        self.__number = number

    @property  # 声明number属性,只读
    def number(self):
        if self.__number >= 100:
            raise ValueError('范围超出100')
        return self.__number


if __name__ == '__main__':
    test = Test(3)  
    print(test.number)  # 3

@func.setter

setter就是给@property声明的属性设置值,func是当前函数的名字,但是当前函数setter,又需要指向property,所以property声明的函数名 和 setter的函数名需要一致,根据赋值操作还是获取操作决定走哪个方法

class Test:
  def __init__(self,number):
    self.__number = None
    
  @property # 声明属性
  def number(self):
    if self.__number >= 100:
      raise ValueError('范围超出100')
    return self.__number
  
  @number.setter # 设置属性
  def number(self,number)
  		self.__number = number
    
'''
声明和设置属性的函数名字可以完全自定义,但是要与初始化变量名做区分,如果都一样的话会出现同名递归报错
'''

test = Test()
test.number = 30  # setter 设置值
print(test.number) #property声明的number获取值
@func.deleter

deleter装饰器见名知意,就是属性的删除操作,实际开发过程中,具体实现的逻辑由我们自己实现,当del属性的时候,会触发该装饰器函数内的流程,但是是否是删除操作,根据业务场景来实现

class Test:

    def __init__(self):
        self.__number = None

    @property
    def number(self):
        return self.__number

    @number.setter
    def number(self, number):
        self.__number = number

    @number.deleter
    def number(self):
        self.__number = 100


if __name__ == '__main__':
    test = Test()
    test.number = 10
    print(test.number)  # 10
    del test.number
    print(test.number)  # 100
'''
该示例中,deleter的方法中将number设置为了100,
del test.number后触发该流程,所以在deleter做什么事情,由自己决定,
可以是 del self.__number 也可有是self.__number=None等等,del只是触发条件
'''
property(fget,fset)

除了上面使用装饰器声明,还可有在类中设置属性指向property()对象,设置set和get的方法以及del方法

class Test:

    def __init__(self):
        self.__number = None

    def get_number(self):
        return self.__number

    def set_number(self, number):
        self.__number = number

    def del_number(self):
        del self.__number

    # 设置number属性指向property对象
    # fget 获取的时候触发的方法
    # fset 赋值的时候触发的方法
    # fdel 删除的时候触发的方法

    number = property(fget=get_number, fset=set_number, fdel=del_number)


if __name__ == '__main__':
    test = Test()
    test.number = 100
    print(test.number)
    del test.number

原文链接:https://www.cnblogs.com/Mickey-7/p/17306118.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python property、setter、deleter - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • python实现windows下文件备份脚本

    下面我将详细讲解 “Python实现Windows下文件备份脚本”的攻略。 1. 需求分析和方案设计 我们需要实现一个Python脚本,可以在Windows系统下,将指定目录中的文件进行备份。根据需求分析,我们需要实现以下功能: 备份时间的设定:用户可以指定备份时间,只有到了指定的时间才进行备份。 忽略一些特定的目录或者文件。 当存在同名文件时,根据用户的设…

    python 2023年6月3日
    00
  • Python数据类型之Tuple元组实例详解

    Python数据类型之Tuple元组实例详解 什么是元组(Tuple) 在Python中,元组表示一些有序的元素的集合,它与列表(list)很像,但是它具有不可变性。这意味着,一旦创建了一个元组,在其生命周期中,不能对它的元素进行修改,删除或添加操作。可以把元组看作是只读的列表。在Python中,元组使用圆括号括起来,元素之间可以使用逗号分隔。 定义元组 定…

    python 2023年5月14日
    00
  • Python爬虫信息输入及页面的切换方法

    当进行Python爬虫时,我们需要在网页上进行信息输入,同时还需要能够自动切换到不同的页面来获取更多的信息。在本文中,我们将详细讲解Python爬虫信息输入以及页面切换的方法,帮助你完成你的爬虫任务。 基本知识 在开始之前,我们需要了解一些基本的知识: requests 模块:可以进行网页数据的请求和响应。 BeautifulSoup 模块:可以进行网页数据…

    python 2023年5月14日
    00
  • python关于调用函数外的变量实例

    当我们需要在一个函数内使用函数外的变量实例时,有几种方法可以实现该功能。 1.使用全局变量(不建议使用) 在Python中,可以通过声明变量为全局变量,来在函数内部直接使用它。但是这种方法不太安全,因为全局变量可能被其他函数或模块修改而导致出错。 示例代码: count = 0 # 定义全局变量count def increment(): global co…

    python 2023年6月5日
    00
  • python实现简单的名片管理系统

    Python实现简单的名片管理系统 介绍 本文将介绍如何使用Python实现一个简单的名片管理系统。该系统具有以下功能: 添加一个新的名片 显示名片列表 按名字查找名片 按电话号码查找名片 删除名片 退出系统 实现步骤 创建一个空的名片列表 显示系统菜单,让用户选择需要执行的操作 根据用户的选择执行相应的操作 当用户选择退出系统时,保存名片列表并退出系统 具…

    python 2023年5月30日
    00
  • FreeSWITCH使用L16编码通信及raw数据提取

    环境:CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 Python版本:3.9.12 一、背景描述 PCM(Pulse Code Modulation,脉冲编码调制)音频数据是未经压缩的音频采样数据,它是由模拟信号经过采样、量化、编码转换成的标准数字音频数据。 在FreeSWITCH中体现为L16编码(switch_pcm.c文件),…

    python 2023年5月8日
    00
  • python读取文件列表并排序的实现示例

    Python读取文件列表并排序的实现示例 在Python中,我们可以使用os模块中的listdir()函数来读取指定目录下的所有文件,并使用sorted()函数对文件列表进行排序。本文将介绍如何listdir()函数和sorted()函数来读取文件列表并排序,以及两个示例说明。 读取文件列表并排序的基本概念 在Python中,我们可以使用os模块中的list…

    python 2023年5月13日
    00
  • 解决Python中定时任务线程无法自动退出的问题

    针对Python中定时任务线程无法自动退出的问题,可以采用以下攻略: 使用Timer类代替Thread类启动定时任务线程 在定时任务函数中使用Event类通信以实现线程退出 使用Timer类启动定时任务线程 在Python中,启动定时任务有很多种方式,其中一种比较常用的方式是使用Thread类来创建线程,然后在线程中执行定时任务。但是,在使用Thread类启…

    python 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部