面向对象编程(OOP)可以分解为几个关键概念
- 对象
- 类
- 继承
- 封装
- 抽象
- 多态
对象
- 一切都可以被视为对象
- 对象由两部分定义
- 属性:描述一个对象
- 行为:对象可以执行的函数
- 例如,一个汽车对象
- 属性:颜色、型号、品牌、年份、颜色
- 行为:加速、刹车、转向
有人可能会问对象是如何创建的,这就是类的作用所在
类
- 类是创建对象的蓝图
- 类定义了一组属性(特征)和函数(方法),这些在从该类创建的所有对象中都是共同的。
- 一个类可以有多个对象
- 类是一个蓝图
- 对象是该类的一个实例
- 方法定义了行为
- 属性定义了特征
- self是一个关键属性
- self是一个占位符,关键字,表示对象所在的位置
我将从一个简单的例子开始:一个类 Individual,具有属性姓名、年龄、地址、电子邮件。
class Individual:
def __init__(self,name,age,address,email):
self.name = name
self.age = age
self.address = address
self.email = email
def get_details(self):
print(f' {self.name} 的年龄是 {self.age},住址是 {self.address},电子邮件是 {self.email},他是我们最优秀的分析师')
I_1 = Individual('Raymond', 44, '121 Bolleavue', 'Raymond@outlook.com')
I_1.get_details()
输出 : 44岁的Raymond居住在121 Bolleavue,电子邮件为 Raymond@outlook.com,是我们最优秀的分析师。
继承
继承帮助我们继承父类的所有属性/方法,并添加新的或重写现有的。
我们想创建一个学生,不想定义基本Individual类的属性和方法。
class Student(Individual):
def __init__(self, name, age, address, email, cohort):
super().__init__(name, age, address, email)
self.cohort = cohort
def enroll_course(self):
print(f'将 {self.name},年龄 {self.age},地址 {self.address} 和电子邮件 {self.email} 注册到 {self.cohort} 班级')
my_student = Student('Arnold',30,'180 Nalow','Arnold@email.com','C03')
my_student.enroll_course()
输出 : 将30岁、地址为180 Nalow、电子邮件为Arnold@email.com的Arnold注册到C03组
封装
封装涉及将数据安全地保存在类内部
限制对某些属性和方法的直接访问。
我们使用私有属性/方法(以_
或__
前缀)来实现这一点。
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.__speed = 0
def increase_speed(self,speed):
#调用私有的__accelerate方法以增加速度
self.__accelerate(speed)
def get_Speed(self):
return self.__speed
def __accelerate(self, speed):
# 确保速度不会超过某个限制。
if self.__speed + speed <= 100:
self.__speed += speed
else:
self.__speed = 100
car_1 = Car('丰田','三菱',2006)
car_1.get_Speed()
输出 : 0
car_1.increase_speed(60)
car_1.get_Speed()
输出 : 60
car_1.increase_speed(130)
car_1.get_Speed()
# 输出 100,因为它不会超过
# 速度 <= 100 的行为是私有封装的。
抽象
专注于向外界暴露仅有的必要信息,同时隐藏实现细节。
为用户展示简单性,并隐藏打印逻辑。
多态
在多态中,行为根据对象的不同而变化,
允许我们对不同的数据类型或类使用单一接口。
这是通过一种称为重写的方法实现的,
子类为其父类中定义的方法提供不同的实现。
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
def honk(self):
print('轰轰!!')
class FormulaCar(Car):
def honk(self):
print('嗡嗡!!')
class Lorry(Car):
def honk(self):
print('Rumb rumb!!')
simple_car = Car('Toyota','Vitz','2016')
formula_car = FormulaCar('Mercedes','W11','2020')
lorry_car = Lorry('Mitsubishi','Canter',2007)
vehicles = [simple_car, formula_car, lorry_car]
for vehicle in vehicles:
vehicle.honk()
输出
咆哮咆哮!!
轰鸣轰鸣!!
隆隆隆!!
为什么要使用多态性?
- 能够为相似类定义标准接口
- 代码的重用性:不需要重复定义初始化
- 可以根据需要重写父类的方法,具有灵活性