(15)100天python从入门到拿捏《面向对象编程》
面向对象编程
一、面向对象编程简介
面向对象编程是一种组织代码的思想。
- 一切皆对象;
- 通过 类(class) 定义对象的模板;
- 通过 对象(object) 实际使用数据与功能。
📘 理解类与对象
概念 | 说明 | 说明 |
---|---|---|
类 | 模板、定义了一类对象共有的属性和方法 | “学生类” |
对象 | 类的具体实例 | “张三”这个学生 |
二、定义类与创建对象
基本语法:
class 类名:def 方法(self):pass
📘 案例
class Student:def say_hello(self):print("你好,我是学生!")# 创建对象
stu = Student()
stu.say_hello()
🧾 输出
你好,我是学生!
三、构造方法(__init__
)
构造方法在创建对象时自动调用,用来初始化属性。
📘 案例
class Student:def __init__(self, name, age):self.name = name # 实例属性self.age = agedef show_info(self):print(f"姓名: {self.name}, 年龄: {self.age}")stu1 = Student("张三", 20)
stu1.show_info()
🧾 输出
姓名: 张三, 年龄: 20
四、类属性与实例属性
属性类型 | 定义位置 | 所有对象是否共享 | 示例 |
---|---|---|---|
实例属性 | 构造函数 __init__ 内 | ❌ 否 | 每个学生的姓名不同 |
类属性 | 类体内、方法外 | ✅ 是 | 所有学生都来自同一学校 |
📘 案例
class Student:school = "北京大学" # 类属性def __init__(self, name):self.name = name # 实例属性stu1 = Student("小明")
stu2 = Student("小红")
print(stu1.school, stu2.school)
print(stu1.name, stu2.name)
🧾 输出
北京大学 北京大学
小明 小红
五、方法类型:实例方法、类方法、静态方法
方法类型 | 装饰器 | 访问内容 | 调用方式 |
---|---|---|---|
实例方法 | 无 | 实例属性(self ) | 对象调用 |
类方法 | @classmethod | 类属性(cls ) | 类或对象调用 |
静态方法 | @staticmethod | 无需访问类或实例 | 类调用 |
📘 案例
class Demo:count = 0 # 类属性def __init__(self):Demo.count += 1def instance_method(self):print("实例方法被调用")@classmethoddef class_method(cls):print("类方法被调用,当前对象数:", cls.count)@staticmethoddef static_method():print("静态方法被调用")d = Demo()
d.instance_method()
Demo.class_method()
Demo.static_method()
🧾 输出
实例方法被调用
类方法被调用,当前对象数: 1
静态方法被调用
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例。
六、封装
封装是指 隐藏内部实现细节,只暴露接口。
在 Python 中用 下划线命名规则 实现伪私有属性。
命名方式 | 含义 |
---|---|
name | 公有(可访问) |
_name | 受保护(不建议外部直接访问) |
__name | 私有属性(类外无法直接访问) |
📘案例
class Account:def __init__(self, owner, balance):self.owner = ownerself.__balance = balance # 私有属性def deposit(self, amount):self.__balance += amountdef show_balance(self):print(f"当前余额: {self.__balance}")acc = Account("张三", 100)
acc.deposit(50)
acc.show_balance()# 不能直接访问私有属性
# print(acc.__balance) # 报错
🧾 输出
当前余额: 150
七、继承
子类继承父类属性和方法,可以重用代码。
📘 语法
class 子类(父类):pass
📘 案例
class Person:def __init__(self, name):self.name = namedef say(self):print(f"{self.name} 在说话")class Student(Person):def study(self):print(f"{self.name} 正在学习")stu = Student("李四")
stu.say()
stu.study()
🧾 输出
李四 在说话
李四 正在学习
八、方法重写
子类可以重写父类方法来改变行为。
📘 案例
class Person:def say(self):print("我是一个人")class Student(Person):def say(self):print("我是学生")p = Person()
s = Student()
p.say()
s.say()
🧾 输出
我是一个人
我是学生
九、super()
调用父类方法
📘 案例
class Animal:def __init__(self, name):self.name = namedef speak(self):print(f"{self.name} 叫了一声")class Dog(Animal):def __init__(self, name, breed):super().__init__(name) # 调用父类构造self.breed = breeddef speak(self):super().speak() # 调用父类方法print(f"{self.name} 汪汪叫")dog = Dog("小黑", "拉布拉多")
dog.speak()
🧾 输出
小黑 叫了一声
小黑 汪汪叫
十、多态
不同对象对同一方法调用表现出不同行为。
📘 案例
class Animal:def speak(self):passclass Cat(Animal):def speak(self):print("喵喵")class Dog(Animal):def speak(self):print("汪汪")animals = [Cat(), Dog()]
for a in animals:a.speak()
🧾 输出
喵喵
汪汪
十一、特殊方法
方法 | 说明 | 示例 |
---|---|---|
__init__ | 构造函数 | 初始化对象 |
__str__ | 转字符串 | print(obj) 输出 |
__len__ | 返回长度 | len(obj) |
__add__ | 定义 + 行为 | obj1 + obj2 |
__eq__ | 定义 == 行为 | 比较对象相等性 |
📘 案例
class Book:def __init__(self, title, pages):self.title = titleself.pages = pagesdef __str__(self):return f"《{self.title}》共{self.pages}页"def __len__(self):return self.pagesbook = Book("Python入门", 350)
print(book)
print("页数:", len(book))
🧾 输出
《Python入门》共350页
页数: 350
十二、综合案例:学生管理系统
📘 案例
class Student:def __init__(self, name, sid, score):self.name = nameself.sid = sidself.score = scoredef show(self):print(f"{self.sid} - {self.name} - {self.score}分")class StudentManager:def __init__(self):self.students = []def add_student(self, stu):self.students.append(stu)print(f"添加成功:{stu.name}")def show_all(self):print("学生列表:")for s in self.students:s.show()def get_average(self):if not self.students:return 0avg = sum([s.score for s in self.students]) / len(self.students)print(f"平均分:{avg:.2f}")# 使用
manager = StudentManager()
manager.add_student(Student("张三", "S001", 89))
manager.add_student(Student("李四", "S002", 95))
manager.show_all()
manager.get_average()
🧾 输出
添加成功:张三
添加成功:李四
学生列表:
S001 - 张三 - 89分
S002 - 李四 - 95分
平均分:92.00
十三、总结表格
概念 | 关键词 | 功能 |
---|---|---|
类 | class | 定义对象模板 |
对象 | 实例 | 类的实际存在 |
构造函数 | __init__ | 初始化属性 |
封装 | _var , __var | 隐藏内部实现 |
继承 | class A(B) | 代码复用 |
多态 | 同一接口不同实现 | 提高灵活性 |
类方法 | @classmethod | 操作类属性 |
静态方法 | @staticmethod | 工具型函数 |
魔法方法 | __xxx__ | 定义特殊行为 |
python学习专栏导航
(1)100天python从入门到拿捏《Python 3简介》
(2)100天python从入门到拿捏《python应用前景》
(3)100天python从入门到拿捏《数据类型》
(4)100天python从入门到拿捏《运算符》
(5)100天python从入门到拿捏《流程控制语句》
(6)100天python从入门到拿捏《推导式》
(7)100天python从入门到拿捏《迭代器和生成器》
(8)100天python从入门到拿捏《函数和匿名函数》
(9)100天python从入门到拿捏《装饰器》
(10)100天python从入门到拿捏《Python中的数据结构与自定义数据结构》
(11)100天python从入门到拿捏《模块》
(12)100天python从入门到拿捏《文件操作》
(13)100天python从入门到拿捏《目录操作》
(14)100天python从入门到拿捏《Python的错误与异常机制》