目录
面向对象编程:从函数到类(6/10)
介绍
类与对象
定义类与创建对象
类的构造函数与实例变量
类的方法与属性
实例方法与类方法
私有属性与方法
继承与多态
定义子类与继承
封装与信息隐藏
示例:封装银行账户
综合示例:简单图书管理系统
定义书籍类和图书馆类
总结
面向对象编程:从函数到类(6/10)
介绍
面向对象编程(OOP)是一种编程范式,它通过使用类和对象来封装数据和行为,从而提高代码的复用性和模块化。在 Python 中,OOP 是非常强大的工具,适用于构建大型软件系统或复杂应用程序。在本篇文章中,我们将详细介绍 Python 中的面向对象编程,包括类、对象、继承、多态和封装等概念。通过学习这些内容,你将能够编写出更加结构化和可维护的代码。
类与对象
类(Class)是对象的蓝图,用于定义对象的属性和行为。对象(Object)是类的实例,包含类中定义的属性和方法。
定义类与创建对象
在 Python 中,类通过 class
关键字定义,实例化类则会创建一个对象。
# 定义一个简单的类
class Dog:# 类的构造函数,用于初始化对象def __init__(self, name, age):self.name = name # 属性self.age = age # 属性# 类的方法def bark(self):print(f"{self.name} 正在汪汪叫!")# 创建类的实例
my_dog = Dog("Buddy", 3)# 访问属性和方法
print(f"我的狗的名字是 {my_dog.name},它 {my_dog.age} 岁。")
my_dog.bark()
输出:
我的狗的名字是 Buddy,它 3 岁。
Buddy 正在汪汪叫!
在上面的示例中,我们定义了一个名为 Dog
的类,类包含两个属性(name
和 age
)和一个方法(bark
)。使用类创建了一个实例 my_dog
,并调用了它的方法。
类的构造函数与实例变量
构造函数 __init__()
是 Python 中的特殊方法,用于在创建对象时初始化对象的属性。构造函数中使用 self
参数来引用当前对象的实例。
术语 | 描述 | 示例 |
---|---|---|
类(Class) | 对象的蓝图或模板 | class Dog: |
对象(Object) | 类的实例,包含类定义的属性和方法 | my_dog = Dog("Buddy", 3) |
构造函数 | 用于初始化对象属性的特殊方法 | def __init__(self, name, age): |
实例变量 | 由构造函数定义,属于特定对象的属性 | self.name = name |
类的方法与属性
实例方法与类方法
-
实例方法:用于操作实例数据的方法,通常需要通过
self
访问实例属性。 -
类方法:通过
@classmethod
装饰器定义,接受类本身作为参数,通常用于操作类变量。
class Cat:species = "猫科动物" # 类属性def __init__(self, name, age):self.name = name # 实例属性self.age = age# 实例方法def meow(self):print(f"{self.name} 正在喵喵叫!")# 类方法@classmethoddef get_species(cls):return cls.species# 创建实例
my_cat = Cat("Kitty", 2)# 调用实例方法
my_cat.meow()# 调用类方法
print(Cat.get_species())
输出:
Kitty 正在喵喵叫!
猫科动物
私有属性与方法
在 Python 中,通过在属性和方法前加上双下划线(如 __attribute
)可以使其成为私有的,无法直接在类外部访问。
class BankAccount:def __init__(self, owner, balance):self.owner = ownerself.__balance = balance # 私有属性def deposit(self, amount):if amount > 0:self.__balance += amountprint(f"存入 {amount} 元。当前余额: {self.__balance} 元。")else:print("存款金额必须大于 0。")def __calculate_interest(self): # 私有方法return self.__balance * 0.05# 创建对象
account = BankAccount("Alice", 1000)# 存款
account.deposit(500)# 无法直接访问私有属性和方法
# print(account.__balance) # 会报错
输出:
存入 500 元。当前余额: 1500 元。
继承与多态
继承(Inheritance)允许我们基于已有的类创建新类,从而实现代码复用和扩展。多态(Polymorphism)则允许我们以统一的方式使用不同类型的对象。
定义子类与继承
我们可以通过在类定义中传递父类作为参数来实现继承。
# 定义一个父类
class Animal:def __init__(self, name):self.name = namedef speak(self):pass # 父类定义一个空方法,供子类重写# 定义一个子类
class Dog(Animal):def speak(self):print(f"{self.name} 正在汪汪叫!")class Cat(Animal):def speak(self):print(f"{self.name} 正在喵喵叫!")# 创建对象并调用方法
dog = Dog("Buddy")
cat = Cat("Kitty")dog.speak()
cat.speak()
输出:
Buddy 正在汪汪叫!
Kitty 正在喵喵叫!
在上面的代码中,Dog
和 Cat
类继承自 Animal
类,并重写了 speak()
方法。这就是多态的体现,我们可以使用相同的方法名调用不同的行为。
封装与信息隐藏
封装是将对象的属性和方法隐藏起来,使得外部无法随意修改对象的内部状态。Python 中通过将属性设为私有来实现封装。
示例:封装银行账户
class BankAccount:def __init__(self, owner, balance=0):self.owner = ownerself.__balance = balance # 私有属性def deposit(self, amount):if amount > 0:self.__balance += amountprint(f"已存入 {amount} 元。当前余额: {self.__balance} 元。")else:print("存款金额必须大于 0。")def withdraw(self, amount):if 0 < amount <= self.__balance:self.__balance -= amountprint(f"已取出 {amount} 元。当前余额: {self.__balance} 元。")else:print("取款金额不合法。")# 创建账户并进行存取款操作
account = BankAccount("Alice", 1000)
account.deposit(500)
account.withdraw(300)
account.withdraw(1500) # 超过余额,取款失败
输出:
已存入 500 元。当前余额: 1500 元。
已取出 300 元。当前余额: 1200 元。
取款金额不合法。
综合示例:简单图书管理系统
接下来,我们将创建一个简单的图书管理系统,使用类和对象来组织书籍和用户的操作。
定义书籍类和图书馆类
class Book:def __init__(self, title, author):self.title = titleself.author = authorself.is_borrowed = Falsedef __str__(self):status = "已借出" if self.is_borrowed else "可借"return f"《{self.title}》 - {self.author} ({status})"class Library:def __init__(self):self.books = []def add_book(self, book):self.books.append(book)print(f"添加书籍: 《{book.title}》")def borrow_book(self, title):for book in self.books:if book.title == title and not book.is_borrowed:book.is_borrowed = Trueprint(f"成功借出: 《{title}》")returnprint(f"《{title}》 不可借或不存在。")def return_book(self, title):for book in self.books:if book.title == title and book.is_borrowed:book.is_borrowed = Falseprint(f"成功归还: 《{title}》")returnprint(f"《{title}》 未被借出或不存在。")def display_books(self):for book in self.books:print(book)# 创建图书馆并添加书籍
library = Library()
library.add_book(Book("Python 编程入门", "张三"))
library.add_book(Book("数据结构与算法", "李四"))
library.add_book(Book("人工智能概论", "王五"))# 借出和归还书籍
library.display_books()
library.borrow_book("Python 编程入门")
library.display_books()
library.return_book("Python 编程入门")
library.display_books()
输出:
添加书籍: 《Python 编程入门》
添加书籍: 《数据结构与算法》
添加书籍: 《人工智能概论》
《Python 编程入门》 - 张三 (可借)
《数据结构与算法》 - 李四 (可借)
《人工智能概论》 - 王五 (可借)
成功借出: 《Python 编程入门》
《Python 编程入门》 - 张三 (已借出)
《数据结构与算法》 - 李四 (可借)
《人工智能概论》 - 王五 (可借)
成功归还: 《Python 编程入门》
《Python 编程入门》 - 张三 (可借)
《数据结构与算法》 - 李四 (可借)
《人工智能概论》 - 王五 (可借)
总结
在本篇文章中,我们学习了 Python 中面向对象编程的基础知识,包括类与对象、实例方法与类方法、继承与多态、封装与信息隐藏等内容。通过这些知识,我们可以编写更加模块化、易于维护的代码。最后,我们通过一个简单的图书管理系统综合应用了这些概念。
在下一篇文章中,我们将深入探讨 Python 中的内置库和第三方库,学习如何扩展 Python 的功能,继续提升编程能力。敬请期待!