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使用random.shuffle()打乱列表顺序的方法

    使用Python的random模块,可以很方便地对列表进行打乱顺序的操作。打乱列表的方法是使用random.shuffle()函数,该函数可以在原地将列表中的元素打乱。 下面是使用random.shuffle()函数打乱列表顺序的示例代码: import random # 定义一个列表 lst = [1, 2, 3, 4, 5] # 打乱顺序 random.…

    python 2023年6月3日
    00
  • 使用python 对验证码图片进行降噪处理

    以下是对“使用Python对验证码图片进行降噪处理”的完整攻略。 1. 背景介绍 验证码(CAPTCHA)是网络应用程序中常用的一种图形验证码,用于区分人类用户和计算机程序的区别。由于验证码图像的复杂性和噪声,使得自动识别验证码成为一个具有挑战性的问题。在验证码自动识别的过程中,验证码图片的降噪处理是一个必不可少的步骤,这个过程可以极大地提高验证码的识别准确…

    python 2023年5月18日
    00
  • 在Python中使用NumPy对Legendre级数进行积分并设置积分的下限

    首先,需要导入NumPy和SciPy的库: import numpy as np from scipy.integrate import quad 接下来,我们定义一个函数来计算Legendre级数: def legendre_series(x, n): return np.sum([(2*n+1)/(2**(n+1))*np.math.factorial(…

    python-answer 2023年3月25日
    00
  • django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例

    下面我将详细讲解“django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例”的完整攻略。 1. 准备工作 首先需要安装 Django 和 Layui 的相关库文件。Django 是一个 Python Web 开发框架,而 Layui 则是一个基于模块化的前端 UI 框架。 使用 pip 命令安装 Django 和 Layui 的相关库文件:…

    python 2023年6月3日
    00
  • 关于探究python中sys.argv时遇到的问题详解

    下面我来为您详细讲解关于探究Python中sys.argv时遇到的问题详解的完整攻略。 什么是sys.argv? sys.argv 是 Python 内置模块 sys 中的一部分,用于获取命令行参数。当我们在命令行中运行 Python 程序时,可以在命令行中输入参数,这些参数将被传递给 Python 程序,并存储在 sys.argv 变量中。sys.argv…

    python 2023年6月2日
    00
  • pip报错“AttributeError: ‘NoneType’ object has no attribute ‘split’”怎么处理?

    当使用 pip 安装 Python 包时,可能会遇到 “AttributeError: ‘NoneType’ object has no attribute ‘split'” 错误。这个错误通常是由于 pip 安装包时出现问题导致的。以下是详细讲解 pip 报错 “AttributeError: ‘NoneType’ object has no attrib…

    python 2023年5月4日
    00
  • 浅谈Python 命令行参数argparse写入图片路径操作

    我们来详细讲解一下“浅谈Python 命令行参数argparse写入图片路径操作”的完整攻略。 介绍 Python是一种易于学习和使用的编程语言,广泛用于Web开发、科学计算、人工智能等领域。命令行参数是每个需要进行交互的程序都必须考虑的问题。Python中提供了argparse模块,可以轻松地解析命令行参数,使得程序更简洁、易于使用。 在本文中,我们将会通…

    python 2023年6月3日
    00
  • 使用Python来开发Markdown脚本扩展的实例分享

    当需要对Markdown进行特殊处理时,我们可以使用Python来开发Markdown脚本扩展,这种方式相对于修改Markdown源码的方式来说更加简单易操作,也更加灵活。 下面将介绍如何使用Python来开发Markdown脚本扩展的完整攻略: 1. 安装Python和Markdown 在开始之前,需要确保Python和Markdown已经被安装到了本地开…

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