在 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
相关推荐
数据智能老司机1 天前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机1 天前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i1 天前
drf初步梳理
python·django
每日AI新事件1 天前
python的异步函数
python
这里有鱼汤1 天前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook1 天前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室1 天前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三1 天前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试