一文带你搞懂Python类的访问控制

 更新时间:2025年05月27日 08:23:21   作者:烛阴  
这篇文章主要为大家详细介绍了Python中类的访问控制的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解一下

一、访问控制的本质:数据安全与接口设计

1.1 类属性和方法的访问控制

一般情况下,我们会使用 __private_attrs 两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrsPython作为动态语言,打破了传统OOP语言对访问控制的刚性限制。同理类方法的访问控制与属性一样。

class Student:
    def __init__(self, score, name):
        self.name = name  # 公有属性, 可以直接被访问
        self.__score = score  # 私有属性, 不能被直接访问,但是可以通过双下划线实现Name Mangling访问

    def get_score(self):  # 公有方法, 可以直接被访问
        return self.__score

    def __get_score(self):  # 私有方法, 不能被直接访问,但是可以通过双下划线实现Name Mangling访问
        return self.__score
        
s = Student(100, 'Bob')
print(s.name)  # 访问公有属性
print(s._Student__score)  # 访问私有属性,Name Mangling
print(s.get_score())  # 访问公有方法
print(s._Student__get_score())  # 访问私有方法,Name Mangling

这段代码看似实现了信息隐藏,实际通过_Student__score仍可访问。这种"约定优于限制"的设计哲学,体现了Pythonic的核心思想。

1.2 类专有的方法

方法说明
__init__构造函数,在生成对象时调用
__del__析构函数,释放对象时使用
__repr__打印,转换
__setitem__按照索引赋值
__getitem__按照索引获取值
__len__获得长度
__cmp__比较运算
__call__函数调用
__add__加运算
__sub__减运算
__mul__乘运算
__div__除运算
__mod__求余运算
__pow__乘方

当然有些时候我们需要获取类的相关信息,我们可以使用如下的方法:

  • type(obj):来获取对象的相应类型;
  • isinstance(obj, type):判断对象是否为指定的 type 类型的实例;
  • hasattr(obj, attr):判断对象是否具有指定属性/方法;
  • getattr(obj, attr[, default]) 获取属性/方法的值, 要是没有对应的属性则返回 default 值(前提是设置了 default),否则会抛出 AttributeError 异常;
  • setattr(obj, attr, value):设定该属性/方法的值,类似于 obj.attr=value;
  • dir(obj):可以获取相应对象的所有属性和方法名的列表

二、访问器模式的现代写法(@property进阶)

传统getter/setter模式:

class TemperatureSensor:
    def get_temperature(self):
        return self._raw_data * 0.8 - 5
    
    def set_temperature(self, value):
        if value < -273.15:
            raise ValueError("Absolute zero violation")
        self._raw_data = (value + 5)/0.8

sensor = TemperatureSensor()
sensor.set_temperature(20)
print(sensor.get_temperature())

现代Python推荐使用更优雅的@property装饰器:

class TemperatureSensor:
    @property
    def temperature(self):
        return self._raw_data * 0.8 - 5
    
    @temperature.setter
    def temperature(self, value):
        if value < -273.15:
            raise ValueError("Invalid temperature")
        self._raw_data = (value + 5)/0.8


sensor = TemperatureSensor()
sensor.temperature = 25
print(sensor.temperature)

实战技巧:在setter中可以加入类型检查、范围验证、历史记录等增强功能

三、总结

控制级别定义方式可访问范围使用场景
公有成员name任意位置对外暴露的完整接口
保护成员_name (单下划线)本类及子类内部实现但允许继承扩展
私有成员__name本类内部绝对私有防止外部干扰

到此这篇关于一文带你搞懂Python类的访问控制的文章就介绍到这了,更多相关Python类访问控制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • pandas 强制类型转换 df.astype实例

    pandas 强制类型转换 df.astype实例

    这篇文章主要介绍了pandas 强制类型转换 df.astype实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Django实现WebSocket在线聊天室功能(channels库)

    Django实现WebSocket在线聊天室功能(channels库)

    本文基于channels库Django实现WebSocket在线聊天室功能,包括安装及创建django项目的全过程,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Playwright中Assertions断言的方法实现

    Playwright中Assertions断言的方法实现

    在编写测试时,我们使用assert语句来断言一段条件并以此为基础条件,我们要么通过测试,要么不通过测试,Playwright给我们提供了另一个API,可以以一种更易读的方式用来执行相同的判断
    2026-01-01
  • Python绘制条形热图的示例代码

    Python绘制条形热图的示例代码

    条形热图(Strip Heatmap) 就像一位魔法设计师,用色彩编码和有序排列让复杂数据变得清爽直观,本文我们就来学习一下如何使用Python绘制简单的条形热图吧
    2025-07-07
  • Python绘制TSP、VRP问题求解结果图全过程

    Python绘制TSP、VRP问题求解结果图全过程

    本文介绍用Python绘制TSP和VRP问题的静态与动态结果图,静态图展示路径,动态图通过matplotlib.animation模块实现动画效果,保存为GIF需安装PIL库支持
    2025-09-09
  • Python基于sftp及rsa密匙实现远程拷贝文件的方法

    Python基于sftp及rsa密匙实现远程拷贝文件的方法

    这篇文章主要介绍了Python基于sftp及rsa密匙实现远程拷贝文件的方法,结合实例形式分析了基于RSA秘钥远程登陆及文件操作的相关技巧,需要的朋友可以参考下
    2016-09-09
  • python数据可视化之matplotlib.pyplot基础以及折线图

    python数据可视化之matplotlib.pyplot基础以及折线图

    不论是数据挖掘还是数据建模,都免不了数据可视化的问题,对于Python来说,Matplotlib是最著名的绘图库,它主要用于二维绘图,这篇文章主要给大家介绍了关于python数据可视化之matplotlib.pyplot基础以及折线图的相关资料,需要的朋友可以参考下
    2021-07-07
  • 使用Python在PDF中设置图片透明度的操作方法

    使用Python在PDF中设置图片透明度的操作方法

    在 PDF 文档编辑中,适当地调整图片的透明度,可以帮助实现更平衡的版面效果,使内容层次更清晰、视觉更协调,助 Free Spire.PDF for Python,我们可以通过简单的 Python 代码灵活设置图片的透明度,而无需借助复杂的图像编辑软件,需要的朋友可以参考下
    2025-11-11
  • tensorflow入门之训练简单的神经网络方法

    tensorflow入门之训练简单的神经网络方法

    本篇文章主要介绍了tensorflow入门之训练简单的神经网络方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Flask Paginate实现表格分页的使用示例

    Flask Paginate实现表格分页的使用示例

    flask_paginate是Flask框架的一个分页扩展,用于处理分页相关的功能,本文就来介绍一下Flask Paginate实现表格分页的使用示例,感兴趣的可以了解一下
    2023-11-11

最新评论