首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第7章 编程术语
7.1 编程术语定义
7.1.1 作为语言的Python和作为解释器的Python
7.1.2 垃圾回收
7.1.3 字面量
7.1.4 关键字
7.1.5 对象、值、实例和身份
7.1.6 项
7.1.7 可变和不可变
7.1.8 索引、键和哈希值
7.1.9 容器、序列、映射和集合类型
7.1.10 特殊方法
7.1.11 模块和包
7.1.12 可调用对象和头等对象
7.2 经常被混淆的术语
7.2.1 语句和表达式
7.2.2 块、子句和主体
7.2.3 变量和特性
7.2.4 函数和方法
7.2.5 可迭代对象和迭代器
7.2.6 语法错误、运行时错误和语义错误
7.2.7 形参和实参
7.2.8 显式类型转换和隐式类型转换
7.2.9 属性和特性
7.2.10 字节码和机器码
7.2.11 脚本和程序,以及脚本语言和编程语言
7.2.12 库、框架、SDK、引擎、API
第8章 常见的Python陷阱
8.1 循环列表的同时不要增删其中的元素
8.2 复制可变值时务必使用copy.copy()和copy.deepcopy()
8.3 不要用可变值作为默认参数
8.4 不要通过字符串连接创建字符串
8.5 不要指望sort()按照字母顺序排序
8.6 不要假设浮点数是完全准确的
8.7 不要使用链式!=运算符
8.8 不要忘记在仅有一项的元组中添加逗号
第9章 Python的奇特难懂之处
9.1 为什么256 是256,而257 不是257
9.2 字符串驻留
9.3 假的Python 增量运算符和减量运算符
9.4 传递空列表给all()
9.5 布尔值是整数值
9.6 链式使用多种运算符
9.7 Python 的反重力特性
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(三)
小册名称:Python编程轻松进阶(三)
### 7.2.9 属性和特性:深入理解Python对象模型 在Python编程的进阶之旅中,理解对象的属性和特性(properties)是掌握面向对象编程(OOP)精髓的关键一步。属性和特性虽然在概念上有所重叠,但在实际应用中扮演着不同的角色,它们共同构成了Python对象模型的重要组成部分。本章节将深入探讨Python中属性和特性的概念、区别、使用方法以及它们在编程实践中的应用场景。 #### 7.2.9.1 属性的基础 在Python中,属性是对象状态的表示,它们是类变量和实例变量的统称。类变量属于类本身,由所有实例共享;而实例变量则属于类的某个具体实例,每个实例可以有自己独立的实例变量值。通过点号(`.`)操作符,我们可以访问或修改对象的属性。 ```python class Person: species = "Human" # 类变量 def __init__(self, name, age): self.name = name # 实例变量 self.age = age # 实例变量 person1 = Person("Alice", 30) print(person1.name) # 访问实例变量 print(Person.species) # 访问类变量 ``` #### 7.2.9.2 特性的概念 特性(Properties)是Python中一种特殊的属性,它允许你对属性的访问和修改进行更细致的控制。通过定义getter、setter和deleter方法,特性可以封装内部数据,防止外部代码直接访问或修改这些数据,从而保护对象状态的完整性和一致性。 - **Getter**:用于获取属性值。 - **Setter**:用于设置属性值,可以包含验证逻辑。 - **Deleter**:用于删除属性,通常较少使用。 在Python中,可以使用`@property`装饰器来创建只读属性(仅通过getter),或者结合`@<attribute_name>.setter`和`@<attribute_name>.deleter`来定义完整的特性。 ```python class Circle: def __init__(self, radius): self._radius = radius # 使用下划线前缀表示私有属性 @property def radius(self): return self._radius @radius.setter def radius(self, value): if value < 0: raise ValueError("Radius must be non-negative") self._radius = value @radius.deleter def radius(self): raise AttributeError("Cannot delete the radius attribute") circle = Circle(5) print(circle.radius) # 访问radius circle.radius = 10 # 修改radius # circle.radius = -1 # 这将引发ValueError # del circle.radius # 这将引发AttributeError ``` #### 7.2.9.3 属性和特性的区别 - **直接访问 vs 封装访问**:普通属性(如实例变量)可以直接通过点号操作符访问和修改,而特性则通过getter、setter(可选)和deleter(可选)方法间接访问,提供了更高的封装性。 - **用途不同**:普通属性适用于简单的数据存储和访问,而特性则适用于需要控制属性访问过程(如验证输入、记录日志、触发事件等)的场景。 - **安全性与完整性**:使用特性可以保护对象的状态不被外部代码随意修改,有助于维护数据的安全性和完整性。 #### 7.2.9.4 属性的动态添加与删除 Python的灵活性允许我们在运行时动态地向对象添加或删除属性。虽然这提供了极大的灵活性,但也需要注意不要破坏对象的封装性和数据一致性。 ```python class DynamicAttributes: pass obj = DynamicAttributes() obj.new_attribute = "Hello, World!" print(obj.new_attribute) # 删除属性 del obj.new_attribute # 尝试访问已删除的属性将抛出AttributeError # print(obj.new_attribute) # Uncomment to see the error ``` #### 7.2.9.5 应用场景 - **数据验证**:在setter方法中验证属性值,确保它们符合预定义的条件。 - **计算属性**:某些属性可能不是直接存储的,而是通过其他属性计算得出的。通过getter方法可以实现这种逻辑。 - **懒加载**:对于昂贵的计算或资源密集型操作,可以通过getter方法在首次访问时进行计算并缓存结果,以实现懒加载。 - **属性安全**:通过特性防止外部代码直接访问或修改敏感数据,提高程序的安全性。 - **封装**:隐藏对象内部的复杂实现细节,仅通过特性暴露必要的接口。 #### 7.2.9.6 实战演练 假设我们正在开发一个银行账户系统,需要对账户余额的访问和修改进行严格控制。通过特性,我们可以确保余额始终为非负值,并在余额发生变化时记录日志。 ```python class BankAccount: def __init__(self, owner, initial_balance=0): self.owner = owner self._balance = initial_balance @property def balance(self): return self._balance @balance.setter def balance(self, value): if value < 0: raise ValueError("Balance cannot be negative") self._balance = value print(f"New balance set to {value} for {self.owner}") # 使用BankAccount类 account = BankAccount("Alice", 100) print(account.balance) # 输出:100 account.balance = 150 # 输出:New balance set to 150 for Alice # account.balance = -50 # 这将引发ValueError ``` #### 7.2.9.7 结论 通过本章的学习,我们深入理解了Python中属性和特性的概念、区别、使用方法以及它们在编程实践中的应用场景。属性和特性是面向对象编程中不可或缺的元素,它们共同支撑起Python对象模型的强大功能。掌握这些概念不仅有助于我们编写更加健壮、灵活和易于维护的代码,还能提升我们对Python编程语言的深入理解。在未来的编程实践中,不妨多尝试使用特性来封装和控制对对象属性的访问,以更好地保护数据的安全性和完整性。
上一篇:
7.2.8 显式类型转换和隐式类型转换
下一篇:
7.2.10 字节码和机器码
该分类下的相关小册推荐:
Python合辑14-面向对象编程案例(下)
Python编程轻松进阶(二)
Python机器学习实战
Python爬虫入门与实战开发(下)
Python与办公-玩转PPT
Python爬虫入门与实战开发(上)
Python数据分析与挖掘实战(上)
Python与办公-玩转PDF
Python合辑3-字符串用法深度总结
Python合辑12-面向对象
Python数据分析与挖掘实战(下)
Python合辑10-函数