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

作者:

文章目录
  • 传统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类访问控制内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Python的代理类实现,控制访问和修改属性的权限你都了解吗 python类:class创建、数据方法属性及访问控制详解 python魔法方法-属性访问控制详解 Python变量访问权限控制详解
  • 目录
    • 一、访问控制的本质:数据安全与接口设计
      • 1.1 类属性和方法的访问控制
      • 1.2 类专有的方法
    • 二、访问器模式的现代写法(@property进阶)
      • 三、总结

        一般情况下,我们会使用 __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的核心思想。

        方法 说明
        __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):可以获取相应对象的所有属性和方法名的列表

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

        您可能感兴趣的文章:

        • Python的代理类实现,控制访问和修改属性的权限你都了解吗
        • python类:class创建、数据方法属性及访问控制详解
        • python魔法方法-属性访问控制详解
        • Python变量访问权限控制详解

        站内搜索