1. 面向对象编程的基本概念
面向对象编程(OOP)是一种重要的编程范式,在Python语言中已经成为了标准。面向对象编程是软件开发中的一种编程方法,它将对象作为程序的基本单元,将数据和行为封装在对象中(即封装、继承、多态性),用于描述真实世界中的事物模型。下面我们来了解一下面向对象编程中的一些基本概念。
1.1 类和对象
“类”是指某一类对象的抽象概念,是一种数据类型。它是对某一类事物的统称,具有相同的属性和方法。而“对象”是类的一个实例,它具有该类所定义的所有属性和方法。可以简单理解,类就是一张蓝图,对象就是由这张蓝图实例化出的实例。
# 定义一个简单的Person类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# 实例化一个Person对象
p1 = Person("张三", 20)
# 访问对象的属性
print(p1.name)
print(p1.age)
上面的例子中,我们定义了一个简单的Person类,并实例化了一个Person对象p1。在实例化时向其传递了两个参数,分别对应属性name和age。然后我们通过对象的属性访问方式来获取对象的属性值,输出结果为:
'张三'
20
1.2 封装、继承和多态性
面向对象编程的三大特性是封装、继承和多态性,它们是面向对象编程的核心。
1.2.1 封装
封装是指将数据和对数据进行操作的方法包装在一起,以实现隐藏数据的内部实现细节。所谓“数据封装”,就是将一个数学模型中不应该被外界直接访问的“数据”,和“对此数据进行操作的方法”统一起来,形成一个不可分割的整体。
# 定义一个Student类
class Student:
def __init__(self, name, age, grade):
self.name = name
self.__age = age # 这里将年龄属性设为私有属性
self.grade = grade
# 将私有属性age封装起来,以实现对外部的隐藏
def getAge(self):
return self.__age
# 实例化一个Student对象
s1 = Student("李四", 18, "高二")
# 访问对象的属性
print(s1.name)
print(s1.grade)
# 下面这行代码会报错,因为age属性是私有属性
# print(s1.__age)
# 通过类的get方法获取私有属性age
print(s1.getAge())
在上面的例子中,我们将属性age设为私有属性,即“__age”,这样就可以在外部无法直接访问这个属性。要访问这个属性,可以自定义一个get方法,在方法内部返回这个属性的值。
1.2.2 继承
继承是指从已有类中派生出新类的过程。即新类具有已有类的属性和方法,并且可以在此基础上添加新的属性和方法。被继承的类称为父类,继承出来的新类称为子类。子类可以继承到父类的所有属性和方法,包括私有属性和方法。在子类中,可以通过“super()”函数调用父类的方法,以实现对父类的重写,以及对方法的扩展。
# 定义一个简单的People类
class People:
def __init__(self, name, age):
self.name = name
self.age = age
def getInfo(self):
return "姓名:" + self.name + ",年龄:" + str(self.age)
# 定义一个Student类,继承People类
class Student(People):
def __init__(self, name, age, grade):
# 调用父类的构造方法
super(Student, self).__init__(name, age)
self.grade = grade
# 继承父类的getInfo方法
def getInfo(self):
return super(Student, self).getInfo() + ",班级:" + self.grade
# 实例化一个Student对象
s1 = Student("王五", 16, "高一")
# 调用Student的getInfo方法
print(s1.getInfo())
在上面的例子中,我们定义了一个People基类和一个Student子类,子类Student继承了基类People的属性和方法。然后我们通过“super()”函数实现了对父类getInfo方法的重写,以及对方法的扩展。最后我们实例化了一个Student对象s1,并调用其getInfo方法进行输出。
1.2.3 多态性
多态性是指同一类事物的不同对象,可能对同一消息做出不同的响应。简单来说,就是不同类的对象对同一个方法会有不同的实现方式,可以根据对象的不同调用不同的方法。Python天然支持多态性,因为Python是一种动态类型语言,不需要进行类型声明,可以根据运行时的上下文自动判断类型。
# 定义两个类,它们都实现了work方法
class Cat:
def work(self):
return "抓老鼠"
class Dog:
def work(self):
return "看门"
# 实例化两个对象
c = Cat()
d = Dog()
# 调用work方法
print(c.work())
print(d.work())
在上面的例子中,我们定义了两个类Cat和Dog,并且它们都实现了work方法。当我们实例化对象c和d后,调用work方法时,就会根据不同的对象调用不同的方法来实现多态性。
2. 面向对象编程的实战应用
2.1 实例:银行账户类的定义
下面我们通过一个实际的例子来讲解一下如何定义一个银行账户类,以实现用户的存款、取款、查询等操作。
class Account:
def __init__(self, id, name, balance):
self.id = id
self.name = name
self.balance = balance
def deposit(self, amount):
if amount <= 0:
return "无效的金额"
else:
self.balance += amount
return "存款成功,余额:" + str(self.balance)
def withdraw(self, amount):
if amount <= 0 or amount > self.balance:
return "无效的金额"
else:
self.balance -= amount
return "取款成功,余额:" + str(self.balance)
def inquiry(self):
return "账户ID:" + str(self.id) + ",账户名:" + self.name + ",余额:" + str(self.balance)
在上面的例子中,我们定义了一个Account类,它具有三个属性:id、name、balance。这里我们将返回值的类型都设置为字符串类型,以便在主程序中对它们进行输出。然后我们定义了三个方法deposit、withdraw、inquiry,分别实现了存款、取款、查询操作。需要注意的是,存款、取款方法中针对金额误操作的情况进行了额外的判断处理。最后,我们将账户信息通过字符串的形式返回。
2.2 主程序的编写
下面我们可以通过一个简单的主程序来进行测试。
if __name__ == "__main__":
# 实例化一个账户对象
a = Account(1000, "张三", 5000)
# 存款
print(a.deposit(3000))
# 取款
print(a.withdraw(6000))
# 查询
print(a.inquiry())
在上面的程序中,我们实例化了一个Account对象,并对其进行了存款、取款和查询操作。最后输出了查询操作的结果。
2.3 异常处理
在上面的程序中,存款、取款方法都添加了针对误操作的异常处理语句,用于在发生异常的情况下给出提示信息。有时候,我们还需要在程序发生异常时,给出相应的提示信息。下面我们就来看一下如何对上面的程序进行异常处理。
if __name__ == "__main__":
try:
# 实例化一个账户对象
a = Account(1001, "李四", 5000)
# 存款
print(a.deposit(3000))
# 取款
print(a.withdraw(6000))
# 查询
print(a.inquiry())
# 处理ValueError异常
except ValueError as err:
print(err)
# 处理其他异常
except:
print("程序发生了异常")
在上述程序中,我们用try…except语句将程序进行异常捕获。其中,except ValueError as err表示捕获ValueError异常,将其信息输出;except表示捕获其他异常并输出一个自定义的提示信息。
3. 总结
面向对象编程是一种非常重要的编程思想和方法,利用面向对象编程可以将程序结构化,便于维护和扩展。本文中我们介绍了面向对象编程的基本概念,包括类和对象、封装、继承、多态性。然后通过一个实际的例子,讲解了如何定义银行账户类,并进行操作。最后,我们给出了异常处理的示例,为程序的稳定和安全运行提供了保障。希望本文能够对读者了解面向对象编程有所帮助。