首页
技术小册
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编程轻松进阶(五)
### 16.4 类特性:深入Python的面向对象编程 在Python的面向对象编程(OOP)中,类特性(Class Attributes)是一个重要且强大的概念,它允许我们在类的层面上定义变量,这些变量随后可以被类的所有实例共享。与实例变量(Instance Variables)不同,实例变量属于类的每个单独对象,而类变量则属于类本身,由类的所有实例共享。理解并恰当使用类特性,对于设计高效、可维护的Python程序至关重要。 #### 16.4.1 类特性的基本概念 类特性,顾名思义,是定义在类级别上的变量。它们不是某个特定实例的属性,而是整个类共有的属性。这意味着,当你修改一个类特性的值时,这个改变会影响到类的所有实例。类特性通常用于存储那些与类本身紧密相关,但与具体实例状态无关的数据,比如类的版本信息、计数器(用于跟踪创建的实例数量)等。 ```python class MyClass: class_counter = 0 # 类特性 def __init__(self): MyClass.class_counter += 1 # 每当创建新实例时,类计数器增加 # 创建几个实例 obj1 = MyClass() obj2 = MyClass() print(MyClass.class_counter) # 输出: 2 ``` 在上面的例子中,`class_counter`就是一个类特性,它记录了`MyClass`类创建的实例数量。 #### 16.4.2 类特性与实例变量的区别 尽管类特性和实例变量在语法上看起来相似(都是使用点号`.`来访问),但它们之间存在本质的区别: - **作用域**:类特性属于类本身,而实例变量属于类的实例。 - **共享性**:类特性被类的所有实例共享,而实例变量是独立的,每个实例都有自己的副本。 - **访问方式**:虽然两者都可以通过实例来访问,但类特性更直接地通过类名来访问和修改。 ```python class Example: class_var = "I am a class variable" def __init__(self): self.instance_var = "I am an instance variable" # 访问类特性和实例变量 obj = Example() print(Example.class_var) # 通过类名访问类特性 print(obj.class_var) # 通过实例也能访问类特性 print(obj.instance_var) # 通过实例访问实例变量 # 修改类特性 Example.class_var = "Changed class variable" print(obj.class_var) # 修改对通过实例访问也有效 # 尝试修改实例变量为类特性(不推荐) # obj.class_var = "This will not change the class variable" # 这会创建一个名为class_var的实例变量,遮蔽了类特性 ``` #### 16.4.3 类特性的应用场景 类特性因其共享性,在多种场景下非常有用: - **计数器**:如上例所示,用于跟踪类的实例数量。 - **配置信息**:存储类的全局配置,如日志级别、数据库连接信息等。 - **工厂方法**:在工厂方法中,类特性可以用来存储已创建的实例,以避免重复创建相同的对象。 - **单例模式**:实现单例模式时,类特性用于存储类的唯一实例。 - **静态变量**:模拟静态变量,虽然Python中没有静态变量的直接概念,但类特性可以作为一种替代方案。 #### 16.4.4 注意事项与最佳实践 - **避免在实例方法中意外修改类特性**:除非这是你的设计意图,否则在实例方法中修改类特性可能会导致难以追踪的副作用。 - **使用私有类特性**:如果类特性仅供类内部使用,可以通过在类特性名前加双下划线(`__`)来命名,但这会触发Python的名称改写机制,使得外部访问变得复杂。 - **文档化**:对于任何非直观的类特性使用,都应在类文档中明确说明其用途和预期行为。 - **考虑使用类方法**:当需要基于类特性执行操作时,考虑使用类方法(`@classmethod`),这样可以在不创建实例的情况下调用这些方法。 #### 16.4.5 示例:使用类特性实现单例模式 单例模式是一种常用的设计模式,用于确保一个类仅有一个实例,并提供一个全局访问点。通过类特性,我们可以很容易地实现这一模式。 ```python class Singleton: _instance = None # 私有类特性,用于存储唯一实例 @classmethod def get_instance(cls): if not cls._instance: cls._instance = cls() return cls._instance def __init__(self): if Singleton._instance: raise Exception("This class is a singleton! Use get_instance().") # 使用 instance1 = Singleton.get_instance() instance2 = Singleton.get_instance() print(instance1 is instance2) # 输出: True ``` 在这个例子中,`_instance`是一个私有类特性,用于存储`Singleton`类的唯一实例。`get_instance`类方法负责检查这个实例是否存在,如果不存在则创建它,并返回这个实例。通过这种方式,我们确保了`Singleton`类在整个程序中只有一个实例。 综上所述,类特性是Python面向对象编程中一个强大而灵活的特性,它允许我们在类的层面上定义和共享数据。通过深入理解类特性的概念、应用场景以及最佳实践,我们可以更加高效地设计和实现Python程序。
上一篇:
16.3 类方法
下一篇:
16.5 静态方法
该分类下的相关小册推荐:
Python合辑6-字典专题
Python合辑10-函数
Python3网络爬虫开发实战(下)
Python编程轻松进阶(四)
Python编程轻松进阶(三)
Python数据分析与挖掘实战(上)
Python自动化办公实战
Python高并发编程与实战
Python合辑7-集合、列表与元组
剑指Python(万变不离其宗)
Python3网络爬虫开发实战(上)
Python甚础Django与爬虫