Appearance
第15章:面向对象基础
15.1 面向对象的核心概念
面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将现实世界中的事物抽象为对象,通过对象之间的交互来实现程序功能。
面向对象的核心思想:
- 封装:将数据和操作数据的方法封装在一起
- 继承:子类可以继承父类的属性和方法
- 多态:不同对象调用同一方法,表现出不同的行为
对象的概念:
- 对象是现实世界中实体的抽象,如人、汽车、动物等
- 每个对象都有自己的属性(数据)和方法(操作)
- 例如,"人"作为对象,有姓名、年龄等属性,会说话、走路等方法
15.2 类与对象
类(class)
类是对象的模板,定义了对象的属性和方法。类是一种抽象的概念,而对象是类的具体实例。
对象(instance)
对象是类的实例,根据类创建的具体个体。每个对象都有自己的属性值,但共享类定义的方法。
15.3 类的基础语法
类的定义
python
class 类名:
# 类的属性
属性1 = 值1
属性2 = 值2
# 初始化方法
def __init__(self, 参数1, 参数2, ...):
self.属性1 = 参数1
self.属性2 = 参数2
# 类的方法
def 方法名(self, 参数1, 参数2, ...):
# 方法体
pass初始化方法(init)
__init__方法是类的特殊方法,在创建对象时自动执行,用于初始化对象的属性。
self是方法的第一个参数,代表对象本身- 通过
self.属性名来访问和设置对象的属性
对象的创建与使用
python
# 创建对象
对象名 = 类名(参数1, 参数2, ...)
# 访问对象的属性
对象名.属性名
# 调用对象的方法
对象名.方法名(参数1, 参数2, ...)示例:定义Person类
python
class Person:
"""人类"""
# 类属性
species = "人类"
# 初始化方法
def __init__(self, name, age):
# 实例属性
self.name = name
self.age = age
# 实例方法
def speak(self):
print(f"你好,我是{self.name},今年{self.age}岁。")
def birthday(self):
self.age += 1
print(f"生日快乐!{self.name}现在{self.age}岁了。")
# 创建对象
person1 = Person("张三", 18)
person2 = Person("李四", 20)
# 访问属性
print(person1.name) # 输出:张三
print(person1.age) # 输出:18
print(Person.species) # 输出:人类
# 调用方法
person1.speak() # 输出:你好,我是张三,今年18岁。
person1.birthday() # 输出:生日快乐!张三现在19岁了。
person2.speak() # 输出:你好,我是李四,今年20岁。15.4 面向对象的核心特性
封装
封装是将对象的属性和方法封装在一起,隐藏对象的内部细节,只提供对外的接口。
- 私有属性:在属性名前加上双下划线
__,使其成为私有属性,外部无法直接访问 - 访问器方法:提供
getter和setter方法来访问和修改私有属性
python
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age # 私有属性
# getter方法
def get_age(self):
return self.__age
# setter方法
def set_age(self, age):
if age > 0:
self.__age = age
else:
print("年龄必须大于0")
person = Person("张三", 18)
print(person.name) # 输出:张三
# print(person.__age) # 错误:无法直接访问私有属性
print(person.get_age()) # 输出:18
person.set_age(20)
print(person.get_age()) # 输出:20继承
继承是子类继承父类的属性和方法,减少代码冗余,提高代码复用性。
- 语法:
class 子类名(父类名): - 子类可以:
- 继承父类的属性和方法
- 重写父类的方法
- 添加新的属性和方法
python
class Animal:
"""动物类"""
def __init__(self, name):
self.name = name
def speak(self):
print("动物发出声音")
class Dog(Animal):
"""狗类"""
def speak(self):
print(f"{self.name}汪汪叫")
class Cat(Animal):
"""猫类"""
def speak(self):
print(f"{self.name}喵喵叫")
# 创建对象
dog = Dog("旺财")
cat = Cat("汤姆")
# 调用方法
dog.speak() # 输出:旺财汪汪叫
cat.speak() # 输出:汤姆喵喵叫多态
多态是不同对象调用同一方法,表现出不同的行为。
- 多态的实现基于继承和方法重写
- 通过父类引用指向子类对象,实现运行时的多态
python
def make_animal_speak(animal):
"""让动物发出声音"""
animal.speak()
# 创建对象
dog = Dog("旺财")
cat = Cat("汤姆")
# 调用函数
make_animal_speak(dog) # 输出:旺财汪汪叫
make_animal_speak(cat) # 输出:汤姆喵喵叫实操案例:定义Person类、Student类
案例:定义Person类、Student类
python
"""
面向对象编程示例
功能:定义Person类和Student类,演示继承和多态
"""
class Person:
"""人类"""
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print(f"你好,我是{self.name},今年{self.age}岁。")
class Student(Person):
"""学生类"""
def __init__(self, name, age, student_id, major):
# 调用父类的初始化方法
super().__init__(name, age)
self.student_id = student_id
self.major = major
# 重写父类的方法
def introduce(self):
print(f"你好,我是{self.name},今年{self.age}岁,学号是{self.student_id},专业是{self.major}。")
# 添加新方法
def study(self):
print(f"{self.name}正在学习{self.major}。")
# 创建对象
person = Person("张三", 30)
student = Student("李四", 18, "20230001", "计算机科学与技术")
# 调用方法
person.introduce() # 输出:你好,我是张三,今年30岁。
student.introduce() # 输出:你好,我是李四,今年18岁,学号是20230001,专业是计算机科学与技术。
student.study() # 输出:李四正在学习计算机科学与技术。运行结果
你好,我是张三,今年30岁。
你好,我是李四,今年18岁,学号是20230001,专业是计算机科学与技术。
李四正在学习计算机科学与技术。新手易错点
__init__方法拼写错误:- 错误拼写为
__int__或其他形式 - 正确拼写是
__init__(前后各两个下划线)
- 错误拼写为
self参数遗漏:- 在定义方法时忘记添加
self参数 self是方法的第一个参数,代表对象本身
- 在定义方法时忘记添加
对象属性访问错误:
- 直接访问私有属性(以双下划线开头的属性)
- 应该使用访问器方法(getter和setter)来访问私有属性
类与对象概念混淆:
- 错误地通过类名访问实例属性
- 实例属性应该通过对象名访问,类属性通过类名访问
继承关系错误:
- 子类初始化方法中忘记调用父类的初始化方法
- 应该使用
super().__init__()来调用父类的初始化方法
通过本章的学习,你已经掌握了Python中面向对象编程的基本概念和使用方法。面向对象编程是一种重要的编程范式,它可以帮助你更好地组织和管理代码,提高代码的复用性和可维护性。在实际编程中,你会经常使用面向对象编程来构建复杂的应用程序。
