Python面向对象编程(OOP)小结
Python面向对象编程(OOP)小结
目录
-
面向对象概述
- 面向对象 vs 面向过程
- 核心概念:封装、继承、多态
-
类与对象
- 类与对象的定义与关系
- 类的设计三要素
- 初始化方法
__init__
与内置方法
-
封装
- 封装的概念与实现
- 私有属性与私有方法
- 案例:房屋与家具的封装
-
继承
- 单继承与多继承
- 方法重写与
super()
- 抽象类与接口设计
-
多态
- 多态的定义与应用场景
- 案例:不同子类调用相同方法
-
类属性和类方法
- 类属性 vs 实例属性
- 类方法与静态方法
- 综合案例:游戏类设计
一、面向对象概述
1. 面向对象 vs 面向过程
特性 | 面向过程 | 面向对象 |
---|---|---|
核心思想 | 以步骤为中心(怎么做) | 以对象为中心(谁来做) |
代码组织 | 函数顺序调用 | 对象职责分工,方法封装在类中 |
适用场景 | 简单任务 | 复杂项目,需求易变 |
2. 三大核心特性
- 封装:将属性和方法封装到类中,隐藏实现细节。
- 继承:子类复用父类的代码,支持扩展和重写。
- 多态:不同对象调用相同方法产生不同结果,增加灵活性。
二、类与对象
1. 类与对象的定义
- 类:抽象的模板,定义对象的属性和方法(如“设计图纸”)。
- 对象:类的实例,具体存在的数据实体(如“按图纸制造的飞机”)。
语法示例
class Cat:
def __init__(self, name):
self.name = name # 实例属性
def eat(self): # 实例方法
print(f"{self.name} 爱吃鱼")
tom = Cat("Tom") # 创建对象
tom.eat() # 调用方法
2. 类的设计三要素
- 类名:大驼峰命名法(如
HouseItem
)。 - 属性:对象的特征(如
name
,area
)。 - 方法:对象的行为(如
run()
,eat()
)。
3. 初始化方法与内置方法
__init__
:对象初始化时自动调用,用于定义属性。__str__
:返回对象的描述信息(print
时调用)。__del__
:对象销毁前自动调用,用于资源释放。
示例
class Dog:
def __init__(self, name):
self.name = name
print(f"{name} 来了")
def __str__(self):
return f"我是小狗:{self.name}"
def __del__(self):
print(f"{self.name} 走了")
三、封装
1. 封装的概念
- 目的:隐藏内部实现细节,提供公共访问接口。
- 实现:通过类的属性和方法组织代码。
2. 私有属性与方法
- 语法:在属性或方法名前加两个下划线
__
。 - 规则:只能在类内部访问,外部无法直接调用。
示例
class Women:
def __init__(self, name):
self.name = name
self.__age = 18 # 私有属性
def __secret(self): # 私有方法
print(f"年龄:{self.__age}")
xiaofang = Women("小芳")
# xiaofang.__age # 报错!无法直接访问
四、继承
1. 单继承
- 语法:
class 子类名(父类名)
。 - 特点:子类拥有父类所有属性和方法。
示例
class Animal:
def eat(self):
print("吃饭")
class Dog(Animal): # 继承 Animal
def bark(self):
print("汪汪叫")
dog = Dog()
dog.eat() # 调用父类方法
2. 多继承与 MRO
- 语法:
class 子类名(父类1, 父类2)
。 - MRO:方法解析顺序(通过
类名.__mro__
查看)。
注意:避免多继承中的命名冲突,优先使用单继承。
3. 方法重写与 super()
- 覆盖父类方法:子类定义同名方法。
- 扩展父类方法:使用
super().父类方法()
调用父类逻辑。
示例
class XiaoTianDog(Dog):
def bark(self):
super().bark() # 调用父类方法
print("飞到天上叫") # 扩展新功能
五、多态
1. 多态的实现
- 前提:继承 + 方法重写。
- 特点:不同子类调用相同方法,结果不同。
示例
class Dog:
def game(self):
print("普通玩耍")
class XiaoTianDog(Dog):
def game(self):
print("天上玩耍")
class Person:
def play_with_dog(self, dog):
dog.game() # 根据传入对象类型执行不同方法
xiaoming = Person()
xiaoming.play_with_dog(Dog()) # 普通玩耍
xiaoming.play_with_dog(XiaoTianDog())# 天上玩耍
六、类属性和类方法
1. 类属性 vs 实例属性
类型 | 定义位置 | 访问方式 | 用途 |
---|---|---|---|
类属性 | 类内部直接定义 | 类名.属性名 |
记录与类相关的特征 |
实例属性 | __init__ 中定义 |
对象.属性名 |
记录对象特有的特征 |
示例
class Tool:
count = 0 # 类属性(记录工具总数)
def __init__(self, name):
self.name = name # 实例属性
Tool.count += 1
print(Tool.count) # 输出创建的工具总数
2. 类方法与静态方法
类型 | 修饰器 | 参数 | 访问权限 |
---|---|---|---|
类方法 | @classmethod |
cls |
可访问类属性和类方法 |
静态方法 | @staticmethod |
无 | 不可访问类或实例属性 |
示例
class Game:
top_score = 0 # 类属性(历史最高分)
@classmethod
def show_top(cls):
print(f"最高分:{cls.top_score}")
@staticmethod
def show_help():
print("游戏帮助信息")
Game.show_help() # 调用静态方法
Game.show_top() # 调用类方法
七、注意事项
- 私有成员:外部通过
_类名__属性名
可强制访问,但不推荐。 - 多继承冲突:使用
__mro__
查看方法解析顺序。 - 初始化方法:子类若定义
__init__
,需手动调用super().__init__()
。
通过系统学习以上内容,可全面掌握Python面向对象编程的核心思想与实践技巧。