最新案例动态,请查阅Python进阶:让Python给你一个对象 - 面向对象。小伙伴们快来领取华为开发者空间进行实操吧!
1 概述
1.1 背景介绍
Python从设计之初就是一门面向对象的语言,面向对象编程(OOP)是一种编程范式,它使用“对象”来设计应用程序和组件。
通过本案例可以帮助我们快速掌握Python编程语言的面向对象。
1.2 适用对象
- 个人开发者
- 高校学生
1.3 案例时间
本案例总时长预计30分钟。
1.4 案例流程

说明:
① 登录华为云,开通开发者空间,进入云主机,打开CodeArts IDE for Python创建工程;
② 编写代码运行。
1.5 资源总览
本案例预计花费总计0元。
| 资源名称 | 规格 | 单价(元) | 时长(分钟) |
|---|---|---|---|
| 华为开发者空间-云主机 | 鲲鹏通用计算增强型 kc2 | 4vCPUs | 8G | Ubuntu | 免费 | 30 |
2 准备开发环境
2.1 配置云主机并进入
参考“10分钟玩转云主机” 案例介绍中“2.2 申请云主机”章节内容完成华为开发者空间云主机申请与配置,配置云主机建议:“CPU架构”选择“X86”,“操作系统”选择“Ubuntu”。

然后点击进入桌面进入云主机。

2.2 使用CodeArts IDE创建工程
参考“初识云主机:CodeArts IDE入门”案例介绍“3.1 新建工程”章节新建工程。
新建的工程包含如下三个目录文件部分:
| 目录文件 | 说明 |
|---|---|
| .arts | CodeArts的配置文件 |
| venv | 虚拟环境 |
| main.py | 默认生成的入口文件 |

3 Python面向对象
3.1 代码练习
下面我们主要围绕Python面向对象中类和对象、属性与方法、封装、继承、多态进行讲解和练习。
3.1.1 类和对象
类:类是对象的蓝图或模板,它定义了对象的属性和方法。可以把类当作一种自定义的数据类型,用于创建具有相同特征和行为的对象。
对象:对象是类的实例。当依据类创建对象时,会为对象分配内存空间,并且初始化其属性。对象能够调用类中定义的方法。
代码示例:
#定义一个Book类
class Book:
pass
#实例化一个book对象
book = Book()
print(book)
3.1.2 属性与方法
属性:属性是对象的特征,分为类属性和实例属性。
- 类属性是所有对象共享的属性。
- 实例属性是每个对象独有的属性。
方法:方法是类中定义的函数,用于描述对象的行为。常见的方法有实例方法、类方法、静态方法以及特殊的魔法方法。
- 实例方法:第一个参数通常是self,用于引用调用该方法的对象。实例方法可以访问和修改对象的实例属性。
- 类方法:使用 @classmethod装饰器,第一个参数通常是cls,用于引用类本身。类方法可以访问和修改类属性。
- 静态方法:使用@staticmethod装饰器,没有特定的第一个参数,它与类和对象没有直接的关联,类似于普通函数。
- 魔法方法:是Python中一些特殊命名的方法,以双下划线开头和结尾,如__init__、__str__等。这些方法在特定的情况下会自动调用,用于实现一些特殊的功能。
代码示例:
class Book:
# 类属性
category = "Programming Language"
def __init__(self, title, author):
# 实例属性
self.title = title
self.author = author
# 实例方法
def display_info(self):
print(f"Title: {self.title}, Author: {self.author}, Category: {self.category}")
# 类方法
@classmethod
def change_category(cls, new_category):
cls.category = new_category
# 静态方法
@staticmethod
def is_bestseller(sales):
return sales > 100000
# 魔法方法
def __str__(self):
return f"Book: {self.title} by {self.author}"
book = Book("Python", "author")
book.display_info()
Book.change_category("Computer Science")
print("category:",book.category)
print(Book.is_bestseller(150000))
print(book)
3.1.3 封装
封装是将属性和操作属性的方法绑定在一起,同时隐藏对象的内部实现细节。通过访问控制(如私有属性和方法),可以限制外部对对象内部数据的直接访问。
代码示例:
# 定义一个银行账户类
class BankAccount:
def __init__(self, balance):
# 定义一个私有属性 __balance用于存储账户余额,私有属性以双下划线开头,外部无法直接访问
self.__balance = balance
# 由于__balance是私有属性,外部无法直接访问,通过此方法间接获取
def get_balance(self):
return self.__balance
def deposit(self, amount):
self.__balance += amount
def withdraw(self, amount):
if amount <= self.__balance:
self.__balance -= amount
else:
print("Insufficient funds.")
account = BankAccount(1000)
account.deposit(500)
account.withdraw(200)
print(f"当前账户余额为: {account.get_balance()} 元。")
3.1.4 继承
继承是创建新类的一种方式,新类(子类)可以继承现有类(父类)的属性和方法。子类能够重写父类的方法,也可以添加自身的属性和方法。
代码示例:
#定义父类
class Parent(object):
attr = 100
def __init__(self):
print(" 调用父类构造函数")
def parentMethod(self):
print("调用父类方法")
def setAttr(self, attr):
self.attr = attr
print("父类设置属性值")
def getAttr (self):
print ("attr属性值:", self.attr)
#定义子类
class Child(Parent):
def _init_(self):
print ("调用子类构造方法")
#方法重写,覆盖父类方法
def setAttr(self, attr):
print("子类覆盖父类设置属性值方法")
def childMethod(self):
print("调用子类方法")
c = Child() #实例化子类
c.childMethod() #调用子类的方法
c.parentMethod () #调用父类方法
c.setAttr(200) #调用重写方法设置属性值
c.getAttr() #再次调用父类的方法-获取属性值
3.1.5 多态
多态指的是允许不同的子类对象通过相同的方法名表现出不同的行为。在Python中,多态通常通过方法重写和方法调用的灵活性来实现。
代码示例:
#定义一个父类Shape
class Shape:
#定义一个获取面积的方法
def area(self):
pass
#定义一个子类Square继承父类Shape
class Square(Shape):
def __init__(self, side):
self.side = side
#子类Square重写方法area实现自己获取面积的逻辑
def area(self):
return self.side * self.side
#定义一个子类Circle继承父类Shape
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
#子类Circle重写方法area实现自己获取面积的逻辑
def area(self):
import math
return math.pi * self.radius * self.radius
shapes = [Square(5), Circle(3)]
for shape in shapes:
print(f"Area: {shape.area()}")
3.2 图书馆管理系统
结合上面的知识点,来看一个图书馆管理系统小程序。完整代码参考如下(注意:复制使用请保持缩进相同)。
# 基类:馆藏物品
class LibraryItem:
# 类属性:图书馆名称
library_name = "城市图书馆"
def __init__(self, title, item_id):
# 实例属性
self.__title = title
self.__item_id = item_id
self.__is_borrowed = False
#获取物title
def get_title(self):
return self.__title
#获取物品编号
def get_item_id(self):
return self.__item_id
#物品是否借出
def is_borrowed(self):
return self.__is_borrowed
#借出物品
def borrow(self):
if not self.__is_borrowed:
self.__is_borrowed = True
print(f"{self.__title} 已被借出。")
else:
print(f"{self.__title} 已被借出,无法再次借阅。")
#归还物品
def return_item(self):
if self.__is_borrowed:
self.__is_borrowed = False
print(f"{self.__title} 已归还。")
else:
print(f"{self.__title} 未被借出,无需归还。")
#定义类方法get_library_name
@classmethod
def get_library_name(cls):
return cls.library_name
#定义静态方法is_popular
@staticmethod
def is_popular(borrow_count):
return borrow_count > 100
def __str__(self):
return f"馆藏物品:{self.__title},编号:{self.__item_id},是否借出:{self.__is_borrowed}"
# 子类:书籍
class Book(LibraryItem):
def __init__(self, title, item_id, author):
super().__init__(title, item_id)
self.author = author
def display_info(self):
print(f"书籍:{self.get_title()},作者:{self.author},编号:{self.get_item_id()}")
# 子类:DVD
class DVD(LibraryItem):
def __init__(self, title, item_id, duration):
super().__init__(title, item_id)
self.duration = duration
def play(self):
if not self.is_borrowed():
print(f"正在播放 {self.get_title()}(时长:{self.duration} 分钟)。")
else:
print(f"{self.get_title()} 目前已被借出,无法播放。")
# 创建图书馆馆藏物品
book1 = Book("杀死一只知更鸟", "B001", "哈珀·李")
book2 = Book("百年孤独", "B002", "加西亚·马尔克斯")
dvd1 = DVD("阿凡达", "D001", 162)
dvd2 = DVD("泰坦尼克号", "D002", 194)
library_items = [book1, book2, dvd1, dvd2]
while True:
print("\n欢迎来到城市图书馆!请选择操作:")
print("1. 查看所有馆藏物品信息")
print("2. 借阅物品")
print("3. 归还物品")
print("4. 播放 DVD(仅适用于未借出的 DVD)")
print("5. 退出")
choice = input("请输入你的选择(1 - 5):")
if choice == '1':
for item in library_items:
if isinstance(item, Book):
item.display_info()
print(item)
elif choice == '2':
title = input("请输入要借阅的物品名称:")
for item in library_items:
if item.get_title() == title:
item.borrow()
break
else:
print("未找到该物品,请检查名称。")
elif choice == '3':
title = input("请输入要归还的物品名称:")
for item in library_items:
if item.get_title() == title:
item.return_item()
break
else:
print("未找到该物品,请检查名称。")
elif choice == '4':
title = input("请输入要播放的 DVD 名称:")
for item in library_items:
if isinstance(item, DVD) and item.get_title() == title:
item.play()
break
else:
print("未找到该 DVD 或输入的不是 DVD 名称,请检查。")
elif choice == '5':
print("感谢使用,再见!")
break
else:
print("无效的选择,请输入 1 - 5 之间的数字。")
同时,可以参考上面代码进行扩展练习,例如:添加借阅记录功能。
295



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



