Python创建Getter和Setter

Python中的getter、setter、deleter getter作用:在获取某个属性值(面积)之前想要做别的事情(获取长宽),就给这个属性添加 getter。 setter作用:在给属性(面积)赋值之前想要做别的事情(不许修改面积,代码中返回ValueError报错),就给这个属性添加 setter。 阅读详情

面向对象的编程(OOP)是一种编程范式,它使很多事情变得简单,从可组合性到继承性,使我们能够更快地建立功能和程序部分。这种范式有不同的特点;两个是getters 和setters 。

类是OOP的基础,通常有每个实例所特有的变量,这些变量(通常称为属性)通过方法来设置或获得。这些方法被称为getters 和setters 。

这些行为在支持 OOP 的编程语言中很流行,Python 也支持它。本文将讨论如何在Python中创建一个getter 和setter 。

Getter和Setter

Getter和Setter是帮助我们设置类变量或属性的方法,不需要直接访问,这违背了抽象和封装的目的。因此,通过getters 和setters ,我们被赋予了处理类属性的能力。

在我们创建getters 和setters 之前,重要的是要知道,与其它编程语言不同,Python 没有隐藏字段,所以你可以通过点符号直接访问类中的变量。

我们可以使用普通函数、property() 函数和@property 装饰器来实现getters 和setters 。

创建Getter和Setter

被称为方法的典型类函数对于创建getters 和setters 是很有用的,我们可以使用self 的概念轻松地设置它们。

对于getter ,方法返回属性,而对于setters ,方法将参数绑定到属性上。为了展示,我们将使用一个Employee ,它持有一个position 属性,getter 方法称为getPosition ,setter 方法称为setPosition 。

class Employee:
    def __init__(self) -> None:
        self.position = None
    def getPosition(self):
        return self.position
    def setPosition(self, position):
        self.position = position
Jacob = Employee()
Jinku = Employee()
Jacob.setPosition("Engineer II")
Jinku.setPosition("Senior Engineer")
print(Jacob.position)
print(Jinku.getPosition())

输出:

Engineer II
Senior Engineer

但是,这种设置或方法并没有什么特别的行为。

用property() 函数来创建Getter和Setter

为了获得一些特殊的行为,我们可以利用property() 函数,该函数创建并返回一个属性对象,该对象拥有三个方法:getter(),setter(), 和delete() 。

它有助于提供一个实例属性的接口。这个功能允许我们轻松地创建所有的getter 和setter 能力。

为了使用property() 函数,我们需要设置四个参数值,这些参数值是使property() ,一个高阶函数的函数。

getter,setter, 和delete 方法是它的参数(都是可选的),并且它返回属性对象。

property(fget, fset, fdel, doc)

让我们在我们的OOP代码中使用property() 函数。

class Employee:
    def __init__(self):
        self.position = None
    def getPosition(self):
        return self.position
    def setPosition(self, position):
        self.position = position
    pos = property(getPosition, setPosition)
Jacob = Employee()
Jinku = Employee()
Jacob.position = "Engineer II"
Jinku.position = "Senior Engineer"
print(Jacob.position)
print(Jinku.position)

输出:

Engineer II
Senior Engineer

随着property() 函数的引入,我们有了pos 绑定,它持有属性对象,有助于保持对私有属性的安全访问。

使用@property 装饰器来创建Getter和Setter

我们可以使用@property 装饰器来实现property() 函数,有了它,就不需要在我们的方法中使用get 和set 的名字。

使用@property 装饰器,我们可以重新使用position 名称,它将定义getter 和setter 函数。

有了@property ,我们创建了getter ,有了@position.setter ,我们创建了setter ,这在代码中添加了print 语句后就很明显了,在输出中可以看到。

class Employee:
    def __init__(self):
        self.position = None
    @property
    def position(self):
        print("Get Employee Position: ")
        return self._position
    @position.setter
    def position(self, value):
        print("Set Position")
        self._position = value
Jacob = Employee()
Jinku = Employee()
Jacob.position = "Engineer II"
Jinku.position = "Senior Engineer"
print(Jacob.position)
print(Jinku.position)

输出:

Set Position
Set Position
Set Position
Set Position
Get Employee Position:
Engineer II
Get Employee Position:
Senior Engineer

有四个Set Position ,因为__init__ 方法,当类实例被调用时,它设置了初始position 属性,这导致了前两个。当我们为后面两个设置相应的值时,它又会打印出来。

对于getter ,当它获得属性值时,会打印出语句Get Employee Position ,而getter 只被调用两次。因此,这两个语句。

当我们使用setter 方法时,我们可以在我们的OOP代码中添加验证。

class Employee:
    def __init__(self):
        self.position = None
    @property
    #Python小白学习交流群:711312441
    def position(self):
        print("Get Employee Position: ")
        return self._position
    @position.setter
    def position(self, value):
        print("Set Position")
        if (value != None and len(value) <= 2):
            raise ValueError("Position name is less than two and is deemed invalid")
        self._position = value
Jacob = Employee()
Jinku = Employee()
Jacob.position = "OS"
Jinku.position = "Senior Engineer"
print(Jacob.position)
print(Jinku.position)

输出:

Set Position
Set Position
Set Position
Traceback (most recent call last):
  File "c:UsersakinlDocumentsPythongetterSetter.py", line 20, in <module>
    Jacob.position = "OS"
  File "c:UsersakinlDocumentsPythongetterSetter.py", line 14, in position
    raise ValueError("Position name is less than two and is deemed invalid")
ValueError: Position name is less than two and is deemed invalid
Python的getter和setter方法 当我们对area属性赋值时,实际上是在调用这个setter方法,并根据我们指定的面积重新计算宽度和高度。接着定义一个perimeter的setter方法,对perimeter属性赋值时,实际上是调用这个setter方法,并修改radius属性值。紧接着,我们定义了一个name的setter方法。当我们对name属性赋值时,实际上是在调用这个setter方法,并将属性值首字母大写。示例中, @property 装饰器将name方法转换为只读属性,可以使它像访问类的属性一样访问name方法。 阅读详情

相关推荐

Python中@property装饰器与getter方法的深入解析

幸运的是,Python提供了一个装饰器@property,可以简化属性访问和修改的过程。在name属性的getter方法中,我们使用@property装饰器,将其转换为只读属性。在访问属性时,getter方法被调用并输出了“Getting name”,然后返回属性值“Alice”。与只读属性不同的是,我们还定义了一个setter方法,用于修改属性值。同时,它也提供了更多灵活的属性访问和修改方式。此时,我们可以看到,在访问属性时,getter方法被自动调用,并输出了“Getting name”。

code_welike的博客 344

Python@setter用法介绍

Python@setter是Python编程语言中的一个关键属性,它简化了Python开发者的编程过程,提高了编程效率。

huangxulei的专栏 2046

Pycharm生成Getter和Setter的代码模板

Pycharm生成Getter和Setter的代码模板。

u012632105的博客 2935

Python(装饰器)的getter和setter的方法使用详解

@property 可以将一个方法的调用方式变成“属性调用”。 @property 主要用于帮助我们处理属性的读操作、写操作。 Python没有真正的私有变量,但是我们可以使用以下约定将变量定义为私有变量:使用一个下划线_将变量名称前缀。虽然这不会完全阻止从外部访问该变量,但是这是一种常用的约定,告诉其他程序员不应该直接访问该变量。

qq_41619571的博客 9412

总结所有的池化(Pooling)方法

为什么池化? 池化(Pooling)层和卷积层、全连接层一样,都是卷积神经网络的组成部分。 卷积神经网络中的卷积层会将卷积Filter应用于输入图像,以便创建特征映射来总结输入中这些特征的存在。 卷积层被证明是非常有效的,在深层模型中叠加卷积层可以让接近输入的层学习低层特征(如线条),在模型中更深(高)的层用于学习高阶或者更抽象的特征,如形状或特定对象。 卷积层特征映射输入的一个局限性是它们只能精确记录特征在输入层的位置。这意味着在输入图像中特征位置的小幅移动将导致不同的特征映射。这可以随着重新裁剪

大脸猫的博客 1万+

国产系统迁移实战:在银河麒麟V10上搞定Wine32位支持,让老Windows软件跑起来

本文详细介绍了在银河麒麟V10操作系统上构建Wine32位支持的全过程,帮助用户解决Windows应用迁移难题。从系统架构差异分析到Wine环境配置,再到实战应用部署与优化,提供了一套完整的解决方案,确保老Windows软件在国产系统上稳定运行。

weixin_32288959的博客 649

在 Python 中创建 Getter 和 Setter

面向对象编程(OOP)是一种编程范式,它使很多事情变得容易,从可组合性到继承,并允许我们更快地构建功能和程序部件。这个范式有不同的特点;两个是 getter 和 setter。类是 OOP 的基础,通常具有每个实例唯一的变量,并且这些变量(通常称为属性)通过方法设置或获取。这些方法称为 getter 和 setter。这些行为在支持 OOP 的编程语言中很流行,Python 也支持它。本文将讨论如何在 Python 中创建 getter 和 setter。

迹忆客 589

大白话系列:什么是微服务

用大白话和实际例子来通俗易懂地告诉你什么是微服务~

2401_87403086的博客 1242

python getter setter_python中@property的作用和getter setter的解释

@property作用:python的@property是python的一种装饰器,是用来修饰方法的。我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。1.修饰方法,让方法可以像属性一样访问。class DataSet(object):@propertydef method_with_p...

weixin_40004659的博客 181

第六节 旅烨cms实战练习 -2021.03.11

第六节 旅烨cms实战练习 -2021.03.11 前期使用win10里小皮搭建旅烨cms,以为自己的各项配置有问题,但是小皮能够正常带动DVWA,始终带动不了旅烨cms。 后来与其他安全人员交流,发现win7可以正常运行旅烨cms。 所以目前为何出现问题尚不清楚 1.环境搭建 win7+小皮 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nOSTEFUw-1615475228402)(C:\Users\LuXian\AppData\Roaming\Typora\typora

lyx3429的博客 574

Origin科研绘图——桑基图

是一种用于展示“流动”(flow)关系的可视化图表,常用于呈现能量流、物质流、资金流、信息流等在不同节点之间的传递和分配情况。它最大的特点是用“宽度可变的流线”来直观表示数量大小——流线越宽,代表流量越大,因此特别适合理解复杂系统中资源从哪里来、到哪里去、以及不同路径所占比例。为该流程对应的数量。只需将各个流程逐项填写在 A、B、C 三列即可,流程的排列顺序并非关键,确保起点、终点及对应数值准确才是最重要的。与柱状图、饼图不同,桑基图不仅展示“多少”,还展示“从哪到哪”。至此,本期教程就结束啦。

weixin_41301530的博客 1394

python如何使用元_示范python如何创建和使用一个简单的元类

演示python如何创建和使用一个简单的元类#!/usr/bin/env python#-*- coding: utf-8-*-# [代码名字: Simple metaclass]# [代码分类: Python Core]# [代码描述: Shows how to create a and use a simple metaclass]# [代码作者: Florian Diesch ]# [SNI...

weixin_35662171的博客 108

Matlab 2023b 科研党必备:MOSEK 10.1.25 安装与配置全记录(附License过期解决方案)

本文详细介绍了在Matlab 2023b中安装与配置MOSEK 10.1.25的全过程,特别针对科研用户提供学术许可申请、证书文件部署及环境集成的实用指南。文章还包含常见问题解决方案和性能调优建议,帮助用户高效完成优化计算任务。

weixin_30598225的博客 171

python getter setter_Python @property及getter setter原理详解

@property作用:python的@property是python的一种装饰器,是用来修饰方法的。我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。1.修饰方法,让方法可以像属性一样访问。class DataSet(object):@propertydef method_with_p...

weixin_39822728的博客 90

【Yolo12改进策略】MRFA 小核协同,构建巨大的感受野,同时保持高斯型分布|即插即用|ICCV2025

本文将介绍如何将 UniConvNet 论文中的核心模块——感受野聚合器集成到 Yolo12中,通过一种新颖的“小核协同”范式,在不显著增加计算开销的前提下,显著提升模型的感受野质量和检测精度。在目标检测中,模型要识别一个物体,不仅需要看到物体的局部特征,更需要理解其周围的上下文信息。传统卷积网络通过堆叠小卷积核(如 3x3)来扩大“感受野”,但这个过程缓慢且效率低下。而近期流行的大核卷积,虽然感受野大,但会破坏“距离越近、影响越大”的自然分布,且带来巨大的计算负担。MRFA 找到了一条“中间道路”:它通过

m0_47867638的博客 931

Codex 的 AGENTS.md 到底怎么写?前端、后端两套实战模板,照抄就能用

文件名是大写AGENTS.md,放在项目根目录构建、测试、类型检查命令都是可直接复制执行的只写了 Agent 从代码里推断不出来的约定红线规则用了明确的否定句式(禁止/不要/Never)标注了自动生成目录和禁止修改的模块写清了交付要求(改动清单 + 验证命令 + 风险说明)没有任何密钥、密码、连接串整体一页能看完,核心要点 10 条以内每一条都能通过"删掉会不会更容易犯错"的测试一份短小精准的 AGENTS.md,比一份充斥模糊规则的长文件有用得多。

篮球界最会写bug的人;程序猿中打球最菜的人。 615

python简单代码演示效果-演示python如何创建和使用一个简单的元类的代码

在做工程闲暇时间,将做工程过程比较重要的一些内容备份一下,如下内容段是关于演示python如何创建和使用一个简单的元类的内容,应该能对小伙伴们也有用途。#!/usr/bin/env python# [SNIPPET_NAME: Simple metaclass]# [SNIPPET_CATEGORIES: Python Core]# [SNIPPET_DESCRIPTION: Shows how ...

weixin_37988176的博客 242

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

python中getter底层本质_Python @property及getter setter原理详解

@property作用:python的@property是python的一种装饰器,是用来修饰方法的。我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。1.修饰方法,让方法可以像属性一样访问。 class DataSet(object):@propertydef method_with_...

weixin_30980025的博客 300

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

python装饰器setter实现原理_Python @property及getter setter原理详解

@property作用:python的@property是python的一种装饰器,是用来修饰方法的。我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。1.修饰方法,让方法可以像属性一样访问。class DataSet(object):@propertydef method_with_p...

weixin_39639505的博客 132

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

python property原理_Python @property及getter setter原理详解

Python @property及getter setter原理详解发布时间:2020-09-20 20:41:36来源:脚本之家阅读:101作者:何梦吉他@property作用:python的@property是python的一种装饰器,是用来修饰方法的。我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样...

weixin_29698641的博客 547

python添加getter和setter方法

要为一个类的成员属性增加getter和setter方法时,可以调用property方法 1 class Person: 2 def __init__(self): 3 self.Name = "default" 4 5 def get_name(self): 6 return self.Name 7 8 ...

weixin_30588675的博客 638

python getter setter_python – 从getter / setter到属性的自动转换

我有一个用C语言编写的大型库,有人创建了一个接口,以自动方式在python(2.6)中使用它.现在我有很多带有getter和setter方法的类.真的:我讨厌他们.我想使用属性重新实现具有更多pythonic接口的类.问题是每个班级都有数百个getter和setter,而且我有很多课程.如何自动创建属性?例如,如果我有一个名为MyClass的类,带有GetX()和SetX(x),GetY,SetY...

weixin_39857480的博客 191

Python @property

@property 方法变属性,定义只读属性

tangsiqi130的博客 1294

python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...

上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明。一、 案例说明本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只定义了长度属性的操作。包括三个完整的装饰器,如果大家想试一下少一个操作方法的装饰器,可以直接把对应装饰器去除即可。二、 案例代码1. 定义类Rectangleclass Rectangle()...

weixin_39801613的博客 149

property 定义 getter 跟 setter 方法

class Student(object): @property def birth(self): return self._birth @birth.setter def birth(self, value): self._birth = value @property def age(self):

lyj1101066558的博客 654
上一篇: Python中如何快速解析JSON对象数组
下一篇: Python中Mock和Patch的区别
Python热爱者
博客等级 码龄7年 3056粉丝 1330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值