Python中的面向对象编程(OOP)总结

面向对象编程(OOP)可以分解为几个关键概念

  • 对象
  • 继承
  • 封装
  • 抽象
  • 多态

对象

  • 一切都可以被视为对象
  • 对象由两部分定义
  1. 属性:描述一个对象
  2. 行为:对象可以执行的函数
  • 例如,一个汽车对象
  • 属性:颜色、型号、品牌、年份、颜色
  • 行为:加速、刹车、转向

有人可能会问对象是如何创建的,这就是类的作用所在

  • 类是创建对象的蓝图
  • 类定义了一组属性(特征)和函数(方法),这些在从该类创建的所有对象中都是共同的。
  • 一个类可以有多个对象
  • 类是一个蓝图
  • 对象是该类的一个实例
  • 方法定义了行为
  • 属性定义了特征
  • 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()

输出

咆哮咆哮!!
轰鸣轰鸣!!
隆隆隆!!

 

为什么要使用多态性?

  • 能够为相似类定义标准接口
  • 代码的重用性:不需要重复定义初始化
  • 可以根据需要重写父类的方法,具有灵活性

更多