【Python基础】Python面向对象编程

本文收录于 《Python编程入门》专栏,从零基础开始,分享一些Python编程基础知识,欢迎关注,谢谢!

一、前言

​ Python面向对象编程(简称OOP)是Python语言中最重要的特性之一。它是一种通过“对象”来设计软件的方法。它通过将数据和操作数据的方法封装在对象中,使得程序更加模块化、可重用和易于维护。它遵循一切皆对象的理念,可以将现实世界的事物使用类与实例进行模拟。

​ 对于初学者来说,理解面向对象编程的基本原理和Python中的实现方式是非常有帮助的。本文旨在为初学者提供一个易于理解的Python面向对象编程介绍,并探讨其在实际编程中的应用和优势。

  • 什么是Python?

    Python是由荷兰人吉多·范罗苏姆于1990年初设计的一门高级编程语言,该语言应用领域非常广泛,尤其在数据科学、人工智能、游戏开发等领域,它已经成为最受欢迎的程序设计语言之一,非常适合新手学习。

    Python语言标准库官方使用手册:https://docs.python.org/zh-cn/3/library/turtle.html#turtle-methods

  • Python语言有哪些特点?

    1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。

    2.易于阅读:Python代码定义的更清晰。

    3.易于维护:Python的成功在于它的源代码是相当容易维护的。

    4.丰富的库:Python的最大的优势之一具有丰富的标准库,并且跨平台的,在UNIX,Windows和Mac兼容很好。

    5.面向对象:Python支持面向对象编程,在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。

    6.可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。

    7.可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。

    8.可嵌入: 你可以将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"的能力。

    在这里插入图片描述

二、面向对象编程的基本概念

2.1 类(Class)和对象(Object)
  • 类:类是一个用于创建对象的模板,它约定了对象应该具有的属性和方法。属性是对象的特征(如数据),而方法是对象可以执行的操作(如函数)。例如,一个“汽车”类可能具有“品牌”、“颜色”等属性,具有“行驶”等方法。注意,类是一种抽象的概念,它描述了一类对象的共同特征和行为。

  • 实例化:创建一个类的实例、类的具体对象的过程,称之为实例化。例如,通过“汽车”类,创建了一个丰田汽车对象。即“汽车”类实例化后,得到一个丰田汽车对象。

  • 对象:对象是类的一个实例。每个对象都拥有类中定义的属性和方法,但它们可以有不同的属性值。换句话说,对象是类的具体实例化结果。例如,如果你定义了一个“汽车”类,你可以创建多个汽车对象,每个对象都有自己的品牌、颜色等属性。(PS:一般文章中提到的对象或实例,都是指同一个概念。它们都是类实例化的结果。)

在这里插入图片描述

2.2 封装(Encapsulation)

封装是将数据和操作数据的方法绑定在一起,隐藏对象的属性和实现细节,仅对外提供公共访问方式。在Python中,我们可以通过设置属性和方法的访问权限来实现封装。封装有助于提高代码的安全性和可维护性,防止外部代码直接修改对象的内部状态。

2.3 继承(Inheritance)

继承允许我们创建一个新类,它从现有类中继承属性和方法。这个新类称为子类,而现有类称为父类。子类可以重用父类的代码,并且还可以添加或覆盖父类的方法。继承提高了代码的复用性,并使得类之间的关系更加清晰。

2.4 多态(Polymorphism)

多态意味着多个类可以有相同的方法名,但是这些方法可以根据不同的类表现出不同的行为。在Python中,多态是一个非常自然的概念,因为我们可以对不同的对象使用相同的方法调用,而不需要关心对象的具体类型。多态增加了代码的灵活性和可扩展性。

三、面向对象编程介绍

3.1 定义类

在Python中,使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾,格式如下:

class ClassName:
   '类的帮助信息'   #类文档字符串
   class_suite  #类体

如下创建了一个简单的“汽车”类:

# 定义Car类
class Car:

  # 定义init方法
  def __init__(self, brand, color):
    self.brand = brand
    self.color = color
    
  # 定义drive方法
  def drive(self):
    print(f"Driving a {self.color} {self.brand} car.")

在这个例子中,Car类有两个属性:brand和color,以及一个方法drive。其中,___init___方法是一个特殊的方法,当创建新对象时,它会被自动调用,用于初始化对象的属性。

__init__ 方法的基本用法:

  • 定义:在类定义中,init 方法被定义为一个方法,但它不接受self以外的任何参数,除非这些参数是你希望在创建对象时指定的。

  • self 参数:init 方法必须包含一个名为 self 的参数。在类的方法中,self 代表类的实例本身。通过这个参数,你可以访问类中的属性和其他方法。

  • 初始化属性:在 init 方法内部,你可以设置对象的属性。这通常通过 self.属性名 = 值 的形式来完成。

3.2 创建对象

定义了类之后,我们可以创建该类的对象:

# 通过汽车类实例化后,得到一个对象my_car
my_car = Car("Toyota", "Red")
my_car.drive() # 输出: Driving a Red Toyota car.
3.3 封装

在Python中,我们可以通过在属性或方法名前加一个下划线_来表示它们是受保护的,不建议外部直接访问。也可以使用双下划线__来表示私有属性或方法,这些属性或方法在类的外部是不可见的。

# 定义Car类
class Car:

  # 定义init方法
  def __init__(self, brand, color):
    self._brand = brand
    self.__color = color # 私有属性

  # 定义drive方法
  def drive(self):
    print(f"Driving a {self.__color} {self._brand} car.")
3.4 继承

要创建一个继承自另一个类的子类,我们可以在定义类时指定父类:

# 定义ElectricCar类
class ElectricCar(Car):
  
  # 定义init方法
  def __init__(self, brand, color, battery_size):
    super().__init__(brand, color) # 调用父类的__init__方法
    self.battery_size = battery_size
  
  # 定义“charge_battery”方法
  def charge_battery(self):
    print("Charging the battery.")

在这个例子中,ElectricCar类继承了Car类,并且添加了一个新的属性battery_size和一个新方法charge_battery。子类可以访问和重用父类的属性和方法,并且还可以定义自己特有的属性和方法。

3.5多态

多态的一个简单例子是,我们可以定义多个类,它们都有相同名称的方法,但是行为不同:

# 定义Car类
class Car:
  def drive(self):
    print("Driving a car.")
    
# 定义Boat类
class Boat:
  def drive(self):
    print("Driving a boat.")
    
# 定义drive_vehicle方法
def drive_vehicle(vehicle):
  vehicle.drive()

# 创建对象my_car
my_car = Car()

# 创建对象my_boat
my_boat = Boat()

# 调用drive_vehicle函数
drive_vehicle(my_car) # 输出: Driving a car.
drive_vehicle(my_boat) # 输出: Driving a boat.

在这个例子中,drive_vehicle函数接受一个对象作为参数,并且调用它的drive方法。由于Car和Boat类都有drive方法,我们可以对不同类型的对象使用相同的函数,这体现了多态性。

四、面向对象编程的优势

面向对象编程在实际开发中具有广泛的应用和显著的优势:

  • 模块化:面向对象编程将代码组织成类和对象,使得代码更加模块化和易于管理。每个类负责特定的功能,降低了代码之间的耦合度。

  • 代码复用:通过继承机制,子类可以重用父类的代码,减少了重复编写代码的工作量。同时,封装使得类可以独立开发和测试,提高了代码的可复用性。

  • 可维护性:面向对象编程使得代码更加清晰和易于理解,便于后期的维护和升级。封装和继承机制也使得修改和扩展代码变得更加容易。

  • 灵活性:多态性增加了代码的灵活性和可扩展性。可以通过继承和多态实现不同的行为,而不需要修改现有代码。

五、关于类中属性和方法

类中的内容分为五类:实例属性,实例方法,类属性,类方法,静态方法。

5.1 实例属性

实例属性是绑定到类实例上的变量。每个实例都有自己独立的实例属性副本,即使这些实例属于同一个类。实例属性通常在实例的__init__方法(构造函数)中定义和初始化。

5.2 实例方法

实例方法是定义在类中的函数,它们需要至少一个参数(通常是self),这个参数是对类实例自身的引用。实例方法可以访问和修改实例属性。

5.3 类属性

类属性是绑定到类本身的变量,而不是类的实例。所有类的实例都共享同一个类属性。类属性在类定义中直接定义,不通过任何方法。

5.4 类方法

类方法是通过@classmethod装饰器定义的,它们至少需要一个参数(通常是cls),这个参数是对类自身的引用,而不是类的实例。类方法用于修改类属性或执行与类相关的操作,但不修改实例的状态。

5.5 静态方法

静态方法是通过@staticmethod装饰器定义的,它们既不接收隐式的self参数(实例的引用),也不接收cls参数(类的引用)。静态方法本质上是普通函数,只是被放在了类的命名空间中。

关于的示例如下:

# 定义Car类
class Car:
  # 定义类属性
  CAR_BRAND = ['Audi', 'Toyota', 'Benz']
  CAR_COLOR = ['red', 'black', 'green']

  # 定义类方法
  @classmethod
  def color_info(cls):
    return "color_info is a class method"

  #定义类的静态方法
  @staticmethod
  def brand_info():
    return "brand_info is a static method"

  # 定义init实例方法
  def __init__(self, brand, color):
    # 定义实例属性
    self._brand = brand
    self.__color = color # 私有属性

  # 定义drive实例方法
  def drive(self):
    print(f"Driving a {self.__color} {self._brand} car.")


# 类实例化,创建my_car对象
my_car = Car('Toyota','red')
# 调用实例方法
my_car.drive()
# 调用类属性
print(Car.CAR_BRAND)
# 调用类的静态方法
print(Car.brand_info())
# 调用类方法
print(Car.color_info())

五、总结

​ 面向对象编程是一种强大的编程范式,它可以帮助我们编写更加模块化、可重用和可维护的代码。在Python中,通过定义类、创建对象、使用封装、继承和多态,我们可以充分利用面向对象编程的优点,提高编程效率和代码质量。

如果您对文章中内容有疑问,欢迎在评论区进行留言,我会尽量抽时间给您回复。如果文章对您有帮助,欢迎点赞、收藏。您的点赞,是对我最大的支持和鼓励,谢谢 :-)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姑苏老陈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值