python基础-面向对象opp

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. 总结

面向对象编程是一种非常重要的编程思想和方法,利用面向对象编程可以将程序结构化,便于维护和扩展。本文中我们介绍了面向对象编程的基本概念,包括类和对象、封装、继承、多态性。然后通过一个实际的例子,讲解了如何定义银行账户类,并进行操作。最后,我们给出了异常处理的示例,为程序的稳定和安全运行提供了保障。希望本文能够对读者了解面向对象编程有所帮助。

后端开发标签