在 Python 中创建 Getter 和 Setter

面向对象编程(OOP)是一种编程范式,它使很多事情变得容易,从可组合性到继承,并允许我们更快地构建功能和程序部件。 这个范式有不同的特点; 两个是 getter 和 setter。

类是 OOP 的基础,通常具有每个实例唯一的变量,并且这些变量(通常称为属性)通过方法设置或获取。 这些方法称为 getter 和 setter。

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


Python 中的 Getter 和 Setter

Getters 和 Setters 是帮助我们设置类变量或属性而无需直接访问的方法,违背了抽象和封装的目的。 因此,通过 getter 和 setter,我们就能够处理类属性。

在我们创建 getter 和 setter 之前,重要的是要知道,与其他编程语言不同,Python 没有隐藏字段,因此您可以通过点表示法直接访问类中的变量。

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


在 Python 中使用函数创建 Getter 和 Setter

称为方法的典型类函数对于创建 getter 和 setter 非常有用,我们可以使用 self 概念轻松地设置它们。

该方法为 getter 返回属性,对于 setter,该方法将参数绑定到属性。 为了进行演示,我们将使用一个拥有位置属性的 Employee、名为 getPosition 的 getter 方法和名为 setPosition 的 setter 方法。

python 复制代码
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())

输出:

bash 复制代码
Engineer II
Senior Engineer

但是,这种设置或方法没有太多特殊行为。


在Python中使用property()函数创建Getter和Setter

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

它有助于提供实例属性的接口。 此功能使我们能够轻松创建所有 getter 和 setter 功能。

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

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

python 复制代码
property(fget, fset, fdel, doc)

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

python 复制代码
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)

输出:

bash 复制代码
Engineer II
Senior Engineer

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


使用@property装饰器在Python中创建Getter和Setter

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

使用 @property 装饰器,我们可以重用定义 getter 和 setter 函数的位置名称。

使用 @property,我们创建 getter,使用 @position.setter,我们创建 setter,这通过添加到代码中并在输出中可见的 print 语句显而易见。

python 复制代码
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)

输出:

bash 复制代码
Set Position
Set Position
Set Position
Set Position
Get Employee Position:
Engineer II
Get Employee Position:
Senior Engineer

Set Position 有四种,因为 __init__ 方法在调用类实例时设置了初始位置属性,从而导致了前两种。 当我们将值设置为接下来两个的相应值时,它会再次打印。

对于getter,它在获取属性值时打印语句Get Employee Position,并且getter只被调用两次。 于是就有了这两种说法。

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

python 复制代码
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")
        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)

输出:

bash 复制代码
Set Position
Set Position
Set Position
Traceback (most recent call last):
  File "c:\Users\akinl\Documents\Python\getterSetter.py", line 20, in <module>
    Jacob.position = "OS"
  File "c:\Users\akinl\Documents\Python\getterSetter.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
相关推荐
wuyk55521 分钟前
12.归并排序:分治思想的稳定排序算法
开发语言·数据结构·算法·排序算法
吴声子夜歌26 分钟前
ApacheCommons——commons-text(模板替换与文本算法)
java·开发语言·算法·apache
2601_9622946139 分钟前
Python接口自动化测试实战:使用requests库
python·接口自动化测试·异常处理·requests库·api测试
砚底藏山河1 小时前
【量化纯GET实战 #23】多股票相关性:用收益率看板块联动
java·数据库·python·金融·数据分析
阿童木写作1 小时前
跨境电商翻译工具推荐:批量图片翻译+视频字幕实时翻译
人工智能·python·音视频
晶捷软件1 小时前
晶捷智能:集团型制造企业ERP如何实现多工厂统一管控
大数据·人工智能·python·制造
晴天161 小时前
Ant Design UI 库核心原理与应用
ui
oyguyteggytrrwwwrt1 小时前
闵可夫斯基差演示
python
智购科技无人售货机工厂店1 小时前
2026自动售货机大屏交互设计原则:从信息层级到视觉动线的工程实践~YH
运维·python·单片机·嵌入式硬件·自动化·交互
quantdash_cc1 小时前
量化数据源怎么选:稳定性、实时性和数据完整性到底该如何权衡?
开发语言·python·数据分析·量化交易·股票数据·quantdash