文章目录
1. 面向对象编程思想
1.1. 面向过程
面向过程编程是一种以过程为中心的编程思想,主要关注“怎么做”的问题,将程序分解为一系列步骤或函数。
思考: 想象你要做一顿饭,面向过程就像写一个菜谱:
- 洗菜
- 切菜
- 热锅
- 炒菜
- 装盘
示例:
# 计算学生平均成绩 - 面向过程方式
def calculate_average(scores):
return sum(scores) / len(scores)
def get_grade(score):
if score >= 90:
return "A"
elif score >= 80:
return "B"
else:
return "C"
# 使用函数
student_scores = [85, 92, 78, 90]
average = calculate_average(student_scores)
grade = get_grade(average)
print(f"平均分: {average}, 等级: {grade}")
1.2. 面向对象
面向对象编程是一种以对象为中心的编程思想,主要关注“谁来做”的问题,将程序组织为相互协作的对象。
思考: 同样是做饭,面向对象会这样思考:
- 厨师对象:负责烹饪
- 食材对象:具有各种属性
- 厨具对象:提供烹饪工具
示例:
# 计算学生平均成绩 - 面向对象方式
# 学生类
class Student:
# 构造方法,用于在创建对象时设置其初始状态
def __init__(self, name, scores):
self.name = name
self.scores = scores
# 方法
def calculate_average(self):
return sum(self.scores) / len(self.scores)
# 方法
def get_grade(self):
average = self.calculate_average()
if average >= 90:
return "A"
elif average >= 80:
return "B"
else:
return "C"
# 使用对象
student = Student("张三", [85, 92, 78, 90])
print(f"{student.name}的平均分: {student.calculate_average()}, 等级: {student.get_grade()}")
1.3. 对比小结
| 方面 | 面向过程 | 面向对象 |
|---|---|---|
| 核心思想 | 步骤和函数 | 对象和类 |
| 数据与操作 | 分离 | 封装在一起 |
| 重点 | 算法和逻辑 | 数据和关系 |
| 适用场景 | 简单任务、脚本 | 复杂系统、大型项目 |
| 代码复用 | 函数复用 | 类继承、对象复用 |
思考: 什么时候用面向对象?当你要描述现实世界中的事物及其关系时,面向对象更自然。
2. 类和对象的基本概念
2.1. 类和对象的关系
类: 是抽象的模板,定义了一类对象的共同特征和行为。
对象: 是类的具体实例,具有类定义的属性和方法。
比如说人是一个类,那么对于具体的个人,就可以说是一个对象,而姓名、年龄等就是我的属性。
2.2. 类的定义
使用关键字:class 对类进行定义
示例: 定义一个简单的学生类:
class Student:
# 类属性(所有对象共享)
school = "希望小学"
def __init__(self, name, age):
# 实例属性(每个对象独有)
self.name = name
self.age = age
# 实例方法
def introduce(self):
return f"我叫{self.name},今年{self.age}岁,在{self.school}上学"
2.3. 实例化对象
对象名 = 类名(“属性的值”)
示例: 创建学生对象
# 创建对象
student1 = Student("小明", 12)
student2 = Student("小红", 11)
# 使用对象
print(student1.introduce()) # 我叫小明,今年12岁,在希望小学上学
print(student2.introduce()) # 我叫小红,今年11岁,在希望小学上学
2.4. self关键字
self指向当前对象实例,在方法中用于访问对象的属性和其他方法。
class Test:
def method_without_self():
print("这个方法没有self")
def method_with_self(self):
print("这个方法有self")
# 测试
obj = Test()
# obj.method_without_self() # 错误!缺少参数
obj.method_with_self() # 正确!Python自动传递obj作为self
3. 属性
3.1. 属性的概念
属性是对象的状态或特征,描述对象“有什么”。
3.2. 实例属性与类属性
3.2.1. 实例属性
- 属于单个对象实例
- 每个对象有自己的副本
- 通过self.属性名定义
示例:
class Dog:
def __init__(self, name, breed):
self.name = name # 实例属性
self.breed = breed # 实例属性
dog1 = Dog("旺财", "金毛")
dog2 = Dog("小黑", "拉布拉多")
print(dog1.name) # 旺财
print(dog2.name) # 小黑 - 每个对象有自己的name
3.2.2. 类属性
- 属于类,所有对象共享
- 在类内部、方法外部定义
- 修改会影响所有对象
示例:
class Dog:
# 类属性
species = "犬科动物"
count = 0
def __init__(self, name):
self.name = name
Dog.count += 1 # 统计创建了多少个对象
print(f"狗的物种: {Dog.species}")
dog1 = Dog("旺财")
dog2 = Dog("小黑")
print(f"创建了{Dog.count}只狗") # 创建了2只狗
# 修改类属性会影响所有对象
Dog.species = "哺乳动物"
print(dog1.species) # 哺乳动物
print(dog2.species) # 哺乳动物
3.3. 属性的动态绑定
Python允许在运行时动态添加属性。
这种灵活性有利有弊,需要谨慎使用!
class Person:
def __init__(self, name):
self.name = name
person = Person("张三")
# 动态添加属性
person.age = 25
person.city = "北京"
print(f"{person.name}, {person.age}岁, 来自{person.city}")
# 动态删除属性
del person.city
# print(person.city) # 报错:属性不存在
4. 方法
4.1. 实例方法
- 最常用的方法类型
- 第一个参数必须是self
- 可以访问和修改实例属性和类属性
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.balance = balance
# 实例方法
def deposit(self, amount):
"""存款"""
self.balance += amount
return f"存款{amount}成功,当前余额:{self.balance}"
def withdraw(self, amount):
"""取款"""
if amount <= self.balance:
self.balance -= amount
return f"取款{amount}成功,当前余额:{self.balance}"
else:
return "余额不足"
# 使用
account = BankAccount("李四", 1000)
print(account.deposit(500)) # 存款500成功,当前余额:1500
print(account.withdraw(200)) # 取款200成功,当前余额:1300
4.2. 类方法
- 使用 @classmethod 装饰器
- 第一个参数是cls(类本身)
- 主要用于操作类属性或创建替代构造函数
示例:
class Student:
count = 0
def __init__(self, name):
self.name = name
Student.count += 1
@classmethod
def get_count(cls):
return cls.count
@classmethod
def from_string(cls, student_str):
"""替代构造函数:从字符串创建对象"""
name = student_str.split(",")[0] # 只取名字部分
return cls(name)
# 使用
student3 = Student.from_string("小刚,15")
print(student3.name) # 小刚
4.3. 静态方法
- 使用 @staticmethod装饰器
- 不需要self或cls参数
- 与类相关,但不依赖类或实例的辅助函数
示例:
class MathUtils:
@staticmethod
def add(x, y):
return x + y
@staticmethod
def is_even(number):
return number % 2 == 0
@staticmethod
def calculate_circle_area(radius):
return 3.14159 * radius ** 2
# 使用静态方法
print(MathUtils.add(5, 3)) # 8
print(MathUtils.is_even(10)) # True
print(MathUtils.calculate_circle_area(5)) # 78.53975
# 也可以通过对象调用
utils = MathUtils()
print(utils.add(2, 2)) # 4
5. 初始化和析构
5.1. __init__方法
Python中最重要的特殊方法之一,被称为构造方法或初始化方法。 它在创建对象时自动调用,用于初始化对象的属性。
示例:
class Car:
def __init__(self, brand, model, year):
print("正在初始化汽车对象...")
self.brand = brand
self.model = model
self.year = year
self.mileage = 0 # 默认值
def drive(self, distance):
self.mileage += distance
return f"行驶了{distance}公里,总里程:{self.mileage}"
# 创建对象时自动调用__init__
my_car = Car("丰田", "凯美瑞", 2022)
print(my_car.drive(100)) # 行驶了100公里,总里程:100
5.2. __del__方法
Python中的一个特殊方法,称为析构器或析构方法。__del__方法在对象被销毁时自动调用,用于执行清理操作。但需要注意的是,Python有自动垃圾回收机制,所以__del__的调用时机可能不是那么直观。
class Student:
def __init__(self, name):
self.name = name
print(f"{self.name}被创建了")
def __del__(self):
print(f"{self.name}被销毁了")
s1 = Student("小明")
del s1 # 手动删除对象引用
print("程序继续执行")
输出:

可以对del s1 进行注释,比对输出效果更好理解。
5.3. __str__方法
_str_ 方法应该返回一个可读性好的字符串,通常用于显示给最终用户。当使用print()函数、str()函数或在字符串格式化中引用对象时,Python会自动调用这个方法。
示例:
class Student:
def __init__(self, name, age, grade):
self.name = name
self.age = age
self.grade = grade
# __str__方法必须有返回值
def __str__(self):
return f"学生信息: 姓名={self.name}, 年龄={self.age}, 年级={self.grade}"
# 使用示例
student = Student("张三", 15, "高一")
print(student) # 自动调用__str__
# 输出: 学生信息: 姓名=张三, 年龄=15, 年级=高一
# 等价于
print(student.__str__())
print(str(student))
输出:

综合示例: 完整的类设计
class Book:
# 类属性
library_name = "城市图书馆"
def __init__(self, title, author, pages):
# 实例属性
self.title = title
self.author = author
self.pages = pages
self.is_borrowed = False
# 实例方法
def borrow(self):
if not self.is_borrowed:
self.is_borrowed = True
return f"《{self.title}》借阅成功"
else:
return f"《{self.title}》已被借出"
def return_book(self):
if self.is_borrowed:
self.is_borrowed = False
return f"《{self.title}》归还成功"
else:
return f"《{self.title}》未被借出"
# 类方法
@classmethod
def change_library(cls, new_name):
cls.library_name = new_name
return f"图书馆已更名为:{new_name}"
# 静态方法
@staticmethod
def is_valid_book(title, author, pages):
return len(title) > 0 and len(author) > 0 and pages > 0
# 析构方法
def __del__(self):
print(f"《{self.title}》对象已被销毁")
# 使用示例
book1 = Book("Python编程", "John Doe", 300)
book2 = Book("数据科学", "Jane Smith", 400)
print(book1.borrow()) # 《Python编程》借阅成功
print(book2.borrow()) # 《数据科学》借阅成功
print(book1.return_book()) # 《Python编程》归还成功
print(Book.change_library("数字图书馆")) # 图书馆已更名为:数字图书馆
print(Book.is_valid_book("", "作者", 100)) # False - 书名不能为空

被折叠的 条评论
为什么被折叠?



