首页
技术小册
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.1 方法 `__init__()` 和 `self` 在Python中,面向对象编程(OOP)是一种强大的编程范式,它允许我们创建具有属性和方法的对象。`__init__()` 方法在面向对象编程中扮演着至关重要的角色,它是类的构造函数,用于在创建新对象时初始化对象的属性。而 `self` 参数则是连接类与其实例的桥梁,它代表了类的实例本身。本章节将深入探讨 `__init__()` 方法和 `self` 的概念、用法以及它们如何协同工作来构建Python中的面向对象程序。 #### 15.3.1.1 理解 `__init__()` 方法 `__init__()` 方法是一个特殊的方法(也称为魔术方法或双下划线方法),它在创建类的新实例时自动调用。这个方法的主要目的是初始化对象的状态,即设置对象的属性。如果没有定义 `__init__()` 方法,Python会提供一个默认的构造函数,该构造函数不执行任何操作。然而,为了创建有用的对象,我们通常会定义自己的 `__init__()` 方法。 ```python class Person: def __init__(self, name, age): self.name = name self.age = age # 创建Person类的实例 person1 = Person("Alice", 30) print(person1.name) # 输出: Alice print(person1.age) # 输出: 30 ``` 在上面的例子中,`Person` 类定义了一个 `__init__()` 方法,它接受三个参数:`self`、`name` 和 `age`。`self` 是对当前实例的引用,而 `name` 和 `age` 是传递给构造函数的参数,用于初始化对象的属性。 #### 15.3.1.2 `self` 参数详解 `self` 在Python的类定义中是一个约定俗成的参数名,用于表示类的实例本身。在调用类的方法时,不需要显式传递 `self` 参数;Python会自动处理。然而,在定义类的方法时,必须包含 `self` 作为第一个参数。 `self` 的作用主要体现在以下几个方面: 1. **访问实例属性**:通过 `self` 可以访问和修改对象的属性。 2. **调用其他方法**:在类的方法内部,可以通过 `self` 调用同一个类的其他方法。 3. **区分实例方法和类方法**:`self` 的存在使得Python能够区分实例方法和类方法(类方法使用 `@classmethod` 装饰器,且第一个参数通常命名为 `cls` 而不是 `self`)。 ```python class Counter: def __init__(self, start=0): self.count = start def increment(self): self.count += 1 def get_count(self): return self.count # 使用Counter类 counter = Counter(5) counter.increment() print(counter.get_count()) # 输出: 6 ``` 在这个例子中,`increment` 和 `get_count` 方法都使用了 `self` 来访问和修改实例的 `count` 属性。 #### 15.3.1.3 `__init__()` 方法的进阶用法 `__init__()` 方法不仅可以用来初始化对象的属性,还可以包含更复杂的逻辑,比如验证输入参数、计算派生属性等。 **验证输入参数**: ```python class Rectangle: def __init__(self, width, height): if width <= 0 or height <= 0: raise ValueError("Width and height must be positive") self.width = width self.height = height # 尝试创建一个非法的Rectangle实例 try: rect = Rectangle(0, 10) except ValueError as e: print(e) # 输出: Width and height must be positive ``` **计算派生属性**: ```python class Circle: def __init__(self, radius): self.radius = radius self.area = self.calculate_area() def calculate_area(self): return 3.14159 * self.radius ** 2 # 创建一个Circle实例 circle = Circle(5) print(circle.area) # 输出: 78.53975 ``` 在这个例子中,`Circle` 类的 `__init__()` 方法不仅初始化了 `radius` 属性,还计算了 `area` 属性并将其存储在实例中。这样,每次访问 `area` 属性时,都不需要再次计算,从而提高了效率。 #### 15.3.1.4 注意事项 - **不要将 `self` 视为普通参数**:在类的方法定义中,`self` 是必须的,但在调用方法时不需要显式传递。 - **避免在 `__init__()` 方法中执行复杂逻辑**:虽然 `__init__()` 方法可以包含复杂逻辑,但通常建议将其保持在简单和直接的状态,以便易于理解和维护。 - **使用文档字符串(Docstrings)**:为 `__init__()` 方法和其他方法编写文档字符串是一个好习惯,它可以帮助其他开发者(或未来的你)理解方法的用途和参数。 #### 结论 `__init__()` 方法和 `self` 是Python面向对象编程中的核心概念。`__init__()` 方法用于初始化对象的属性,而 `self` 参数则用于在类的方法中引用实例本身。通过合理使用这两个概念,我们可以构建出功能强大、易于维护的面向对象程序。希望本章内容能帮助你更深入地理解Python中的面向对象编程,并在你的编程实践中发挥作用。
上一篇:
15.3 创建一个简单的类——WizCoin
下一篇:
15.3.2 特性
该分类下的相关小册推荐:
Python合辑14-面向对象编程案例(下)
Python合辑4-130个字符串操作示例
Python合辑6-字典专题
Python神经网络入门与实践
Python机器学习基础教程(上)
Python自动化办公实战
Python与办公-玩转PDF
Python合辑7-集合、列表与元组
Python合辑10-函数
Python甚础Django与爬虫
Python合辑3-字符串用法深度总结
Python编程轻松进阶(一)