当前位置: 代码网 > it编程>前端脚本>Python > 一文带你搞懂Python类的访问控制

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

2025年05月27日 Python 我要评论
一、访问控制的本质:数据安全与接口设计1.1 类属性和方法的访问控制一般情况下,我们会使用__private_attrs两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法

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

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类访问控制内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • python多线程并发测试过程

    一、并发与并行?1、多任务概念:操作系统可以同时运行多个任务。2、并发:任务数量多于cpu核数,通过操作系统的任务调度算法,多个任务可以一起执行,实际总有一些任务不在一起执行,因为…

    2025年05月27日 前端脚本
  • 如何Python使用设置word的页边距

    如何Python使用设置word的页边距

    在编写或处理word文档的过程中,页边距是一个不可忽视的排版要素。它不仅影响文档的视觉美观和可读性,还关系到打印时的版心位置,尤其是在制作正式文档、双面打印材料... [阅读全文]
  • Python Flask 库及应用场景

    Python Flask 库及应用场景

    一、flask 库简介flask 是 python 生态中 ​轻量级且高度灵活的 web 开发框架,基于 werkzeug wsgi 工具库和 jinja2 模... [阅读全文]
  • Python中合并列表(list)的六种方法小结

    Python中合并列表(list)的六种方法小结

    列表是python中强大的数据结构,很多时候我们要对它进行增、删、改、查,其中增是常见的操作,一般通过合并列表的方法来实现。那么,如何把2个列表合并成多个列表呢... [阅读全文]
  • 基于Python实现智能天气提醒助手

    基于Python实现智能天气提醒助手

    项目概述今天分享一个实用的python天气提醒助手开发方案,这个工具可以方便地集成到青龙面板或其他调度框架中使用。助手能获取实时天气和24小时预报,并通过ai生... [阅读全文]
  • Python实现pdf电子发票信息提取到excel表格

    Python实现pdf电子发票信息提取到excel表格

    应用场景电子发票信息提取系统主要应用于以下场景:企业财务部门:需要处理大量电子发票,提取关键信息(如发票代码、号码、金额等)并录入财务系统。会计事务所:在进行审... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com