Python中Getter和Setter的正确实现方式:从property到@property装饰器

阿澈
阿澈
发布时间:2026-10-16 | 10人浏览过
原创

本文详解Python中Getter和Setter方法的实现机制。对比普通方法与property()内置函数的区别,重点解析@property装饰器如何优雅地实现数据封装、验证逻辑及属性访问控制,提供完整代码示例与注意事项。

Python中Getter和Setter的实现概述

本文核心内容涵盖以下两点:

  • 详细解析Setter和Getter的具体使用方法,并深入探讨@property装饰器的独特优势。
  • 在Python语言中,Setter和Getter的实现机制与其他主流面向对象编程语言存在显著差异。在大多数面向对象语言中,使用Setter和Getter的主要目的是为了实现数据封装,保护内部状态。然而,Python中的“私有”变量(通常以单下划线或双下划线开头)并非真正不可访问,外部代码仍可通过特定方式访问或修改。因此,在Python中引入Setter和Getter方法通常基于以下场景:
  • 1. 在获取或设置属性值时,通过Setter和Getter添加必要的验证逻辑,确保数据合法性。 2. 避免直接访问类的某些字段,例如类的私有变量不应被外部调用者直接访问或随意修改,从而保持接口的清晰性和数据的安全性。

普通方法实现Getter和Setter的局限性

首先,尝试使用普通函数来实现Setter和Getter。仅仅定义名为get()和set()的方法并不能产生类似其他语言中属性访问的特殊行为。例如:

class Student(object):
    def __int(self, age=0):
        self._age = age
    
    # getter方法
    def get(self):
        return self._age
    
    # setter方法
    def set(self, value):
        self._age = value
        
xiaoming = Student()
# 使用setter方法设置age
xiaoming.set(20)
# 使用getter方法返回age
print(xiaoming.get())
print(xiaoming._age)

运行结果如下:

20 20

在上述代码中,set_age()和get_age()方法在行为上与普通成员方法没有任何区别。那么,如何实现类似其他语言中Getter和Setter的功能呢?这就需要引入Python中的特殊方法property()。

使用property()内置函数实现属性封装

接下来,使用property()内置方法来实现Setter和Getter的行为。property()是Python的一个内置函数,用于创建并返回一个属性对象。一个属性对象包含三个相关方法:getter()、setter()和delete()。property()函数接收四个参数:property(fget, fset, fdel, doc)。其中,fget是用于获取属性值的函数,fset是用于设置属性值的函数,fdel是用于删除属性的函数,doc用于为属性提供文档字符串说明。通过这三个方法,可以分别指定fget、fset和fdel的行为。

class Adult(object):
    def __int(self):
        self.__age = 0
    
    # 获取属性_age的值
    def get_age(self):
        print('getter() method called')
        return self.__age
    
    # 设置属性_age的值
    def set_age(self, value):
        print('setter() method called')
        self.__age = value
    
    # 删除属性_age
    def del_age(self):
        del self.__age
        
    age = property(get_age, set_age, del_age)

laowang = Adult()
laowang.age = 60
print(laowang.age)

运行结果如下:

setter() method called getter() method called 60

在上述代码中,age被定义为一个属性对象,它确保了对私有变量__age的安全访问和封装。

使用@property装饰器实现Pythonic封装

此外,还可以使用@property装饰器来实现Setter和Getter的行为。除了上述使用property()函数的方法外,Python中更推荐使用@property装饰器。@property是Python的一个内置装饰器,其目的是改变类的方法或属性行为,使得调用者在代码中无需进行任何修改即可享受属性访问的便利。

class Adult(object):    
    def __init__(self):
        self.__age = 0
    
    @property
    def age(self):
        print('getter() method called')
        return self.__age
        
    @age.setter
    def age(self, value):
        if value < 18:
            raise ValueError('Sorry, you are a child, games not allowed')
        print('setter() method called')
        self.__age = value
        
xiaoli = Adult()
xiaoli.age = 19
print(xiaoli.age)

运行结果如下:

setter() method called getter() method called 19

上述代码清晰地展示了如何以Pythonic的方式使用@property装饰器来实现Setter和Getter属性。同时,该实现还包含了对属性赋值时的有效性检查(例如年龄必须大于等于18)。

至此,关于Python中Getter和Setter方法的详细使用教程已介绍完毕。如需了解更多相关内容,请搜索本站历史文章或继续浏览后续文章。感谢大家的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表