首页
技术小册
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编程轻松进阶(五)
### 17.1 属性:深入Python对象的灵魂 在Python编程的广阔天地中,属性(Attributes)是连接数据与行为的桥梁,是理解面向对象编程(OOP)不可或缺的一环。本章将深入探讨Python中属性的概念、用法、高级特性以及如何通过属性实现数据的封装与保护,助力读者在Python编程之路上轻松进阶。 #### 17.1.1 属性的基本概念 在Python中,属性是绑定到对象上的变量,用于存储对象的状态信息。每个对象都可以拥有多个属性,这些属性可以是基本数据类型(如整数、浮点数、字符串等),也可以是复杂的数据结构(如列表、字典、其他对象等)。属性通过点号(`.`)操作符进行访问和修改,这是面向对象编程中常见的操作方式。 例如,假设我们有一个表示人的`Person`类,该类有两个属性:`name`和`age`。 ```python class Person: def __init__(self, name, age): self.name = name # 实例化时设置name属性 self.age = age # 实例化时设置age属性 # 创建一个Person对象 person1 = Person("Alice", 30) # 访问属性 print(person1.name) # 输出: Alice print(person1.age) # 输出: 30 # 修改属性 person1.age = 31 print(person1.age) # 输出: 31 ``` 在这个例子中,`self.name`和`self.age`就是`Person`类实例的属性,它们分别存储了人的名字和年龄信息。 #### 17.1.2 属性的动态添加与删除 Python是一种动态语言,这意味着我们可以在运行时动态地给对象添加或删除属性。这种灵活性是Python强大功能的一部分,但也要求开发者在编写代码时更加注意数据的完整性和安全性。 ```python # 动态添加属性 person1.email = "alice@example.com" print(person1.email) # 输出: alice@example.com # 动态删除属性 del person1.email # 尝试访问已删除的属性将引发AttributeError # print(person1.email) # 注释掉以避免运行时错误 ``` #### 17.1.3 属性的封装与保护 面向对象编程的一个重要原则是封装(Encapsulation),即将对象的数据(属性)和操作这些数据的方法(函数)结合在一起,形成一个独立的单元。封装有助于隐藏对象的内部实现细节,仅通过公共接口与外界交互,从而提高代码的安全性和可维护性。 在Python中,虽然可以通过简单的属性访问和修改来实现数据的存储和检索,但这种做法往往缺乏足够的保护机制。为了限制对属性的直接访问,Python提供了`@property`装饰器以及`getter`、`setter`和`deleter`方法来实现属性的封装。 ```python class Person: def __init__(self, name, age): self._name = name # 使用下划线前缀表示私有属性 self._age = age @property def name(self): return self._name @name.setter def name(self, value): if not isinstance(value, str): raise ValueError("Name must be a string") self._name = value @property def age(self): return self._age @age.setter def age(self, value): if not isinstance(value, int) or value < 0: raise ValueError("Age must be a non-negative integer") self._age = value # 使用封装后的属性 person2 = Person("Bob", 25) print(person2.name) # 访问name属性 person2.name = "Robert" # 修改name属性 print(person2.age) # 访问age属性 # 尝试设置非法的age值将引发ValueError # person2.age = -5 # 注释掉以避免运行时错误 ``` 在这个例子中,`_name`和`_age`是私有属性,它们通过`@property`装饰器以及相应的`setter`方法被封装起来。外界只能通过`name`和`age`这两个公共接口来访问和修改这些私有属性的值,同时,`setter`方法内部还可以加入验证逻辑,以确保数据的合法性。 #### 17.1.4 特殊属性与方法 Python中还有一些特殊的属性和方法,它们以双下划线(`__`)开头和结尾,被称为“魔法方法”或“双下划线方法”。这些特殊属性或方法提供了对象内部操作的钩子,允许开发者在对象创建、属性访问、方法调用等关键时刻插入自定义逻辑。 例如,`__dict__`是一个特殊属性,它包含了对象所有可写的属性及其值(不包括通过`@property`封装的属性)。`__slots__`是一个类属性,用于限制实例可以拥有的属性名列表,以提高内存效率和防止动态添加属性。 ```python class MyObject: __slots__ = ['x', 'y'] def __init__(self, x, y): self.x = x self.y = y obj = MyObject(1, 2) print(obj.__dict__) # 对于使用__slots__的类,这将引发AttributeError # 尝试给obj添加不在__slots__中的属性将引发AttributeError # obj.z = 3 # 注释掉以避免运行时错误 ``` #### 17.1.5 属性的高级应用 随着对Python属性深入的理解,我们可以开始探索其高级应用,如属性描述符(Descriptors)、元类(Metaclasses)等。这些高级特性允许开发者在Python的底层机制上构建更加复杂和灵活的数据模型。 - **属性描述符**:是一种特殊类型的对象,它定义了当属性被访问、修改或删除时应该执行的操作。通过实现`__get__`、`__set__`和`__delete__`方法,描述符可以控制对属性的访问权限,实现复杂的属性逻辑。 - **元类**:是创建类的“类”。在Python中,一切皆是对象,包括类本身。元类允许我们控制类的创建过程,包括定义类的属性、方法以及继承关系等。通过元类,我们可以实现更加高级的面向对象编程技术,如自动注册类、动态修改类定义等。 #### 结语 属性作为Python面向对象编程中的核心概念,不仅是数据存储的容器,更是连接数据与行为的桥梁。通过深入理解属性的基本概念、动态特性、封装机制以及高级应用,我们可以编写出更加安全、灵活和可维护的Python代码。希望本章的内容能够帮助读者在Python编程之路上更进一步,轻松进阶。
上一篇:
第 17章 Python 风格的面向对象编程:属性和魔术方法
下一篇:
17.1.1 将特性转换为属性
该分类下的相关小册推荐:
Python与办公-玩转PPT
实战Python网络爬虫
Python合辑13-面向对象编程案例(上)
Python自动化办公实战
Python数据分析与挖掘实战(下)
Python编程轻松进阶(一)
Python合辑3-字符串用法深度总结
Python合辑6-字典专题
剑指Python(万变不离其宗)
Python与办公-玩转Word
Python编程轻松进阶(四)
Python爬虫入门与实战开发(上)