首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 13章 性能测量和大O算法分析
13.1 timeit模块
13.2 cProfile分析器
13.3 大O算法分析
13.4 大O阶
13.4.1 使用书架打比方描述大O阶
13.4.2 大O 测量的是最坏情况
13.5 确定代码的大O 阶
13.5.1 为什么低阶项和系数不重要
13.5.2 大O 分析实例
13.5.3 常见函数调用的大O 阶
13.5.4 一眼看出大O 阶
13.5.5 当n 很小时,大O并不重要,而n通常都很小
第 14章 项目实战
14.1 汉诺塔
14.1.1 汉诺塔输出
14.1.2 汉诺塔源代码
14.1.3 汉诺塔编写代码
14.2 四子棋
14.2.1 四子棋输出
14.2.2 四子棋源代码
14.2.3 四子棋编写代码
第 15章 面向对象编程和类
15.1 拿现实世界打比方:填写表格
15.2 基于类创建对象
15.3 创建一个简单的类——WizCoin
15.3.1 方法__init__()和self
15.3.2 特性
15.3.3 私有特性和私有方法
15.4 函数type()和特性__qualname__
15.5 非OOP 和OOP 的例子:井字棋
15.6 为现实世界设计类是一件难事儿
第 16章 面向对象编程和继承
16.1 继承的原理
16.1.1 重写方法
16.1.2 super()函数
16.1.3 倾向于组合而非继承
16.1.4 继承的缺点
16.2 函数isinstance()和issubclass()
16.3 类方法
16.4 类特性
16.5 静态方法
16.6 何时应该使用类和静态的面向对象特性
16.7 面向对象的行话
16.7.1 封装
16.7.2 多态性
16.8 何时不应该使用继承
16.9 多重继承
16.10 方法解析顺序
第 17章 Python 风格的面向对象编程:属性和魔术方法
17.1 属性
17.1.1 将特性转换为属性
17.1.2 使用setter 验证数据
17.1.3 只读属性
17.1.4 什么时候应该使用属性
17.2 Python 的魔术方法
17.2.1 字符串表示魔术方法
17.2.2 数值魔术方法
17.2.3 反射数值魔术方法
17.2.4 原地魔术方法
17.2.5 比较魔术方法
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(五)
小册名称:Python编程轻松进阶(五)
### 章节 15.3.3 私有特性和私有方法 在Python编程的进阶之旅中,理解并恰当使用类的封装特性是至关重要的。封装不仅有助于隐藏对象的内部实现细节,保护数据不被外部随意修改,还能通过提供公共接口来规范对象的交互方式。其中,私有特性和私有方法是实现封装的重要手段。本章节将深入探讨Python中的私有特性和私有方法,包括它们的定义、使用场景、以及如何通过它们来增强代码的安全性和可维护性。 #### 15.3.3.1 私有特性的概念 在Python中,私有特性(也称为私有属性)是指那些以双下划线(`__`)开头的实例变量。这种命名约定是Python提供的一种访问控制机制,用于告诉其他开发者:“这些变量是内部的,你不应该直接访问它们。”然而,值得注意的是,Python的私有性更多的是基于命名约定而非严格的访问控制,这意味着从技术层面讲,你仍然可以通过特定的方式访问到这些所谓的“私有”变量。 **定义私有特性**: ```python class MyClass: def __init__(self, value): self.__secret_value = value # 定义一个私有特性 # 尝试直接访问私有特性会失败(在正常情况下) obj = MyClass(10) print(obj.__secret_value) # 这会引发 AttributeError ``` **访问私有特性的“合法”方式**: 虽然直接访问私有特性被视为不恰当的行为,但类可以提供公共方法来获取或设置这些私有特性的值,从而维护封装性。 ```python class MyClass: def __init__(self, value): self.__secret_value = value def get_secret_value(self): return self.__secret_value def set_secret_value(self, new_value): # 这里可以添加验证逻辑 self.__secret_value = new_value obj = MyClass(10) print(obj.get_secret_value()) # 正确访问私有特性 obj.set_secret_value(20) print(obj.get_secret_value()) # 私有特性已被更新 ``` #### 15.3.3.2 私有方法的定义与使用 与私有特性类似,私有方法也是以双下划线开头的实例方法或类方法。私有方法通常用于封装类的内部逻辑,这些逻辑不应该被类的外部用户直接调用。它们是实现类内部复杂操作或维护类状态的重要工具。 **定义私有方法**: ```python class MyCalculator: def __init__(self): self.__result = 0 def add(self, x, y): self.__result = self.__perform_operation(x, y, lambda a, b: a + b) def subtract(self, x, y): self.__result = self.__perform_operation(x, y, lambda a, b: a - b) def __perform_operation(self, x, y, operation): """私有方法,执行实际的数学运算""" self.__result = operation(x, y) # 外部代码只能调用 add 和 subtract,不能直接调用 __perform_operation calc = MyCalculator() calc.add(5, 3) print(calc.__result) # 尽管可以这样做,但直接访问__result是不推荐的 ``` **注意**: 虽然技术上可以通过修改类定义或利用Python的反射机制(如`getattr`函数)来访问私有方法和特性,但这种做法违背了封装的原则,应当避免。 #### 15.3.3.3 私有特性的“伪私有”特性 如前所述,Python的私有特性并不是真正的私有,它们只是通过命名约定来实现了一种访问控制。Python实际上会在内部将私有特性的名称“变形”(name mangling),即在属性名前加上类名(如果定义了的话)和两个下划线。这种机制称为名称改写(name mangling)或名称修饰(name mangling)。 ```python class MyClass: def __init__(self, value): self.__secret_value = value print(MyClass.__dict__) # 查看类字典,会发现 __secret_value 被改写为 _MyClass__secret_value ``` 尽管存在这种机制,但开发者仍应遵守Python的命名约定,将双下划线开头的名称视为私有,并避免在类的外部直接访问它们。 #### 15.3.3.4 私有特性和私有方法的最佳实践 1. **封装内部实现**:使用私有特性和方法封装对象的内部状态和行为,仅通过公共接口与外部交互。 2. **提供公共访问器**:为私有特性提供getter和setter方法,以便在需要时控制对私有数据的访问。 3. **维护一致性**:确保类的所有实例都通过相同的接口与外界交互,这有助于维护代码的一致性和可预测性。 4. **避免滥用私有**:不要将所有变量和方法都设为私有,只将那些确实需要保护的内部实现设为私有。 5. **理解名称改写**:虽然不必深入了解名称改写的细节,但应知道Python是如何通过命名约定来实现“私有”的。 通过遵循这些最佳实践,你可以更有效地利用Python的封装特性,编写出更加安全、易于维护的Python代码。在《Python编程轻松进阶(五)》的后续章节中,我们将继续探索更多高级编程概念,帮助你进一步提升Python编程技能。
上一篇:
15.3.2 特性
下一篇:
15.4 函数type()和特性__qualname__
该分类下的相关小册推荐:
Python自动化办公实战
Python机器学习实战
Python爬虫入门与实战开发(下)
Python合辑14-面向对象编程案例(下)
Python合辑5-格式化字符串
Python合辑7-集合、列表与元组
Python合辑11-闭包函数
实战Python网络爬虫
Python面试指南
Python合辑4-130个字符串操作示例
Python合辑2-字符串常用方法
Python机器学习基础教程(下)