面向对象
前言
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程思想,它将数据和操作数据的方法封装在对象
中。OOP的核心思想是以对象为中心,通过定义类来创建对象,并通过对象之间的交互
来实现程序的功能。类的使用有助于组织和管理代码,并实现更高级的软件设计和开发。
1. 面向对象编程思想
1.1 面向对象的相关概念
-
类:描述具有相同属性和方法的集合,简单来说就是模板(.py文件),通它来创建对象
-
对象:类的实例
-
方法:类中定义的函数
-
类变量:定义在类中且在函数之外的变量,在所有实例化对象中公用
-
局部变量:方法中定义的变量,只作用于当前实例
1.2 面向对象的三大特性
封装(Encapsulation)
:将数据和操作数据的方法封装在一个对象中,对象对外部隐藏了其内部实现细节,只暴露必要的接口供其他对象使用。继承(Inheritance)
:通过创建子类来继承父类的属性和方法,子类可以重用父类的代码,并可以根据需要进行修改或扩展。多态(Polymorphism)
:允许不同的对象对同一消息作出不同的响应,即不同的对象可以以自己的方式实现相同的方法。
2. 类的定义
2.1 使用class关键字定义类
在Python中,类的定义使用class
关键字,后跟类的名称
示例:创建一个名为Person
的类,表示人物,包含name
和age
属性,并具有一个greet
方法来打招呼
class Person:
# 构造函数
def __init__(self, name, age):
self.name = name
self.age = age
# 对象方法
def greet(self):
print(f"你好,俺叫 {self.name} ,今年{self.age}岁了")
在上面的示例中,我们定义了一个Person
类。
__init__
方法表示构造函数,用于初始化对象的属性。self
参数代表对象本身,它在方法中使用,以访问对象的属性和方法。name
和age
是对象的属性。greet
方法用于向其他人打招呼,并输出对象的姓名和年龄。
2.2 创建类对象并调用属性和方法
示例:创建Person
类的对象,并访问属性和调用方法。
person1 = Person("Lin", 25)
person2 = Person("kobe", 30)
print(person1.name) # 输出: Lin
print(person2.age) # 输出: 30
person1.greet()
person2.greet()
3.面向对象思想示例
3.1 详细示例:图形类的设计
通过以下示例来说明面向对象编程的思想:我们将设计一个简单的图形类层次结构,包括基类Shape
和两个子类Circle
和Rectangle
,来表示圆和矩形。
下面是Shape
类以及两个子类Circle
和Rectangle
之间的关系图示:
+-----------+
| Shape |
+-----------+
^
|
|
+---------------+
| |
+-------------+ +-------------+
| Circle | | Rectangle |
+-------------+ +-------------+
3.2 基类 Shape
基类Shape
表示图形的抽象概念,它具有通用的属性和方法。(这不奏是java的抽象类么)
在下面的示例中,Shape
类具有一个构造函数__init__
,用于初始化图形的颜色。它还定义了两个方法area
和perimeter
,这些方法在基类中只是占位符,需要在子类中实现
class Shape:
def __init__(self, color):
self.color = color
def area(self):
pass
def perimeter(self):
pass
3.3 子类 Circle
在下面的示例中,Circle
类具有一个构造函数__init__
,它接受颜色和半径作为参数,并调用父类的构造函数来设置颜色。它还实现了基类中定义的area
和perimeter
方法,计算圆的面积和周长。
import math
# 子类`Circle`表示一个圆形,它继承自基类`Shape`。
class Circle(Shape):
def __init__(self, color, radius):
super().__init__(color)
self.radius = radius
def area(self):
return math.pi * self.radius**2
def perimeter(self):
return 2 * math.pi * self.radius
3.4 子类 Rectangle
在上面的示例中,Rectangle
类具有一个构造函数__init__
,它接受颜色、宽度和高度作为参数,并调用父类的构造函数来设置颜色。它还实现了基类中定义的area
和perimeter
方法,计算矩形的面积和周长。
# 子类`Rectangle`表示一个矩形,它也继承自基类`Shape`。
class Rectangle(Shape):
def __init__(self, color, width, height):
super().__init__(color)
self.width = width
self.height = height
def area(self):
return self.width * self.height
def perimeter(self):
return 2 * (self.width + self.height)
3.5 使用图形类
现在我们可以创建Circle
和Rectangle
对象,并使用它们的属性和方法。
circle = Circle("red", 5)
print(circle.color) # 输出: red
print(circle.radius) # 输出: 5
print(circle.area()) # 输出: 78.53981633974483
print(circle.perimeter()) # 输出: 31.41592653589793
rectangle = Rectangle("blue", 4, 6)
print(rectangle.color) # 输出: blue
print(rectangle.width) # 输出: 4
print(rectangle.height) # 输出: 6
print(rectangle.area()) # 输出: 24
print(rectangle.perimeter()) # 输出: 20
在上面的示例中创建了一个红色半径为5的圆形对象circle
,并打印了其颜色、半径、面积和周长。
还创建了一个蓝色宽度为4、高度为6的矩形对象rectangle
,并打印了其颜色、宽度、高度、面积和周长
总结:上面示例中我们把对象的属性color和 area,perimeter方法封装
在Shape基类中,基类Shape表示图形的抽象
概念 。circle 和 rectangle 类通过继承
并调用父类的属性和构造函数来设置颜色,同时还实现了基类中定义的area和perimeter方法。并且相同的方法名实现了不同的行为,这就是多态
的思想实现