【Python篇】Python 类和对象:详细讲解(上篇)

简介: 【Python篇】Python 类和对象:详细讲解(上篇)

Python 类和对象:详细讲解

在编程中,对象面向对象编程(OOP)的核心概念。Python 是一门支持面向对象编程的语言,这意味着你可以使用类和对象来组织代码,使其更加模块化、可维护和可扩展。

1. 什么是类(Class)

  • 是一个蓝图或模板,用来描述某一类对象的共同特征和行为。它定义了对象应该具有什么属性(变量)和行为(方法)。
  • 举个例子,如果你要创建一个汽车管理系统,你可能会定义一个 Car 类,其中包括汽车的品牌、颜色、速度等属性,以及启动、停止、加速等行为。

类的定义

在 Python 中,类使用 class 关键字来定义。让我们来看一个简单的例子:

class Car:
    # 类的属性和方法定义在这里
    pass
  • class Car: 是类的定义,其中 Car 是类的名称。
  • pass 是一个占位符,表示目前类中没有任何内容,但这是一个合法的类定义。

2. 什么是对象(Object)

  • 对象是根据类创建的具体实例。你可以把类看作是一个模具,而对象则是根据这个模具制作出来的具体产品。
  • 如果 Car 是一个类,那么你可以创建多个对象来代表不同的汽车,如 my_caryour_car 等。

创建对象

要创建一个对象,只需要调用类本身,就像调用一个函数一样:

my_car = Car()
  • my_carCar 类的一个实例或对象。
  • 现在,my_car 这个对象可以拥有 Car 类中定义的所有属性和行为。

3. 属性和方法

属性(Attributes)

  • 属性是对象的状态或特征。它们是存储在对象中的变量。
  • 例如,汽车的品牌、颜色、速度都可以作为属性来存储在 Car 对象中。

方法(Methods)

  • 方法是对象可以执行的操作或行为。它们是定义在类中的函数。
  • 例如,汽车可以启动、停止、加速,这些行为可以通过方法来实现。

在类中定义属性和方法

让我们扩展 Car 类,添加一些属性和方法:

class Car:
    # 定义属性
    def __init__(self, brand, color):
        self.brand = brand  # 汽车品牌
        self.color = color  # 汽车颜色

    # 定义方法
    def start(self):
        print(f"The {self.color} {self.brand} car is starting.")

    def stop(self):
        print(f"The {self.color} {self.brand} car is stopping.")


  • __init__ 方法:这是一个特殊的方法,当你创建对象时,Python 会自动调用它。这个方法用于初始化对象的属性。self 是对象自身的引用,后面会详细解释。
  • startstop 方法:这些是普通的方法,用于描述汽车的行为。

使用对象的属性和方法

现在我们可以创建一个 Car 对象,并使用它的属性和方法:

my_car = Car("Toyota", "Red")
print(my_car.brand)  # 输出: Toyota
print(my_car.color)  # 输出: Red

my_car.start()  # 输出: The Red Toyota car is starting.
my_car.stop()   # 输出: The Red Toyota car is stopping.
  • 当我们创建 my_car 对象时,__init__ 方法被自动调用,brand 被设置为 “Toyota”,color 被设置为 “Red”。
  • 我们可以通过 my_car.brandmy_car.color 访问对象的属性,也可以调用 start()stop() 方法来执行相应的行为。

4. self 参数的作用

  • 在方法定义中,self 参数用于指代当前对象的实例。在方法内部,通过 self 可以访问对象的属性和其他方法。
  • 当调用方法时,Python 会自动将调用该方法的对象传递给 self。因此,在定义方法时,self 必须作为第一个参数。

举个例子:

class Car:
    def __init__(self, brand, color):
        self.brand = brand
        self.color = color

    def start(self):
        print(f"The {self.color} {self.brand} car is starting.")
  • 当你调用 my_car.start() 时,实际上等同于 Car.start(my_car),即 Python 会自动将 my_car 对象传递给 self

5. 总结1

  • :一个蓝图,定义了一类对象的属性和行为。
  • 对象:根据类创建的具体实例,具有类定义的属性和方法。
  • 属性:对象的特征或状态,存储在对象中的变量。
  • 方法:对象的行为或操作,定义在类中的函数。
  • self 参数:引用当前对象,用于访问对象的属性和方法。

两个问题

1. Python 类中的缩进

在 Python 中,缩进是代码块的唯一表示方式,这与 C++ 和许多其他语言不同。在 Python 中,没有使用 {} 来定义代码块,而是通过缩进来明确代码块的层级关系。

  • 类的缩进
  • 在类定义的最外层,所有方法和属性的定义都需要有相同的缩进级别。
  • 类中的每个方法或函数,其内容需要进一步缩进,以表示它们属于该方法。

例如:

class Car:
    def __init__(self, brand, color):
        self.brand = brand  # 这行代码相对于方法的定义缩进了一个层级
        self.color = color

    def start(self):
        print(f"The {self.color} {self.brand} car is starting.")

在这个示例中:

  • def __init__(self, brand, color): 是类的一个方法,它相对于 class Car: 缩进了四个空格(或一个 tab)。
  • self.brand = brandself.color = color__init__ 方法中的代码,它们相对于 def __init__ 缩进了四个空格。
2. 为什么 Python 没有像 C++ 那样单独定义成员变量

在 Python 中,没有像 C++ 那样在类的开头单独定义成员变量(属性)的部分。这是因为 Python 采用了一种更灵活的方式来处理对象的属性。这种设计有几个重要原因:

2.1 动态语言的特性
  • 动态类型
  • Python 是一种动态类型的语言,这意味着变量的类型在运行时决定,并且你可以在程序的任何地方为对象添加新的属性。
  • 这与 C++ 等静态类型语言不同。在 C++ 中,你必须在编译时定义对象的所有成员变量(属性)的类型和数量。
2.2 __init__ 方法的灵活性
  • 属性在 __init__ 方法中定义
  • 在 Python 中,通常通过 __init__ 方法来初始化对象的属性。__init__ 方法是一个构造函数,当你创建一个对象时,这个方法会被自动调用。
  • __init__ 方法中使用 self 关键字定义的属性,实际上就是成员变量。这种方式可以根据初始化时传入的参数动态地定义和设置对象的属性。

例如:

class Car:
    def __init__(self, brand, color):
        self.brand = brand  # 这里 brand 就是一个成员变量
        self.color = color  # color 也是一个成员变量
  • 在这个例子中,brandcolorCar 对象的成员变量,通过 self.brandself.color__init__ 方法中定义。
2.3 灵活性和可扩展性
  • 动态添加属性
  • Python 的对象可以在程序的运行时动态地添加或修改属性。这为程序设计提供了极大的灵活性。

例如:

my_car = Car("Toyota", "Red")
my_car.year = 2020  # 动态添加一个新的属性 year
 
  • 在运行时,你可以为 my_car 对象添加一个新的属性 year,这是在 C++ 等静态类型语言中难以实现的。
  • 更少的冗余
  • 由于 Python 的灵活性,你不需要在类的定义中事先声明所有可能的属性,而是可以根据实际需要在 __init__ 方法或其他方法中定义它们。
结论
  • 缩进:Python 使用缩进来明确代码块的层级关系,因此类中的方法和属性都需要适当缩进,以表示它们的层次。
  • 属性定义
  • Python 不需要像 C++ 那样在类的开头单独定义成员变量,而是通常在 __init__ 方法中通过 self 来定义对象的属性。
  • 这种方式更灵活,可以根据传入参数动态定义属性,并且可以在运行时动态添加或修改对象的属性。

6. 实例化多个对象

在前面的例子中,我们已经学会了如何创建一个对象,并使用它的属性和方法。现在我们将学习如何创建多个对象,并理解对象之间的独立性。

实例化多个对象

当你实例化多个对象时,每个对象都是类的一个独立实例,拥有自己独立的属性值。这意味着你可以创建多个对象,它们可以拥有不同的状态(属性值),但都可以共享相同的行为(方法)。

class Car:
    def __init__(self, brand, color):
        self.brand = brand  # 每个对象都有独立的 brand 属性
        self.color = color  # 每个对象都有独立的 color 属性

    def start(self):
        print(f"The {self.color} {self.brand} car is starting.")

    def stop(self):
        print(f"The {self.color} {self.brand} car is stopping.")

# 创建多个对象
car1 = Car("Toyota", "Red")
car2 = Car("Honda", "Blue")
car3 = Car("Ford", "Black")

# 使用这些对象
car1.start()  # 输出: The Red Toyota car is starting.
car2.start()  # 输出: The Blue Honda car is starting.
car3.start()  # 输出: The Black Ford car is starting.

代码解读:

  • 独立的对象car1, car2, car3Car 类的三个独立实例。每个对象都有自己的 brandcolor 属性。
  • 方法的共享:虽然每个对象的属性值不同,但它们都可以调用 start()stop() 方法,这些方法在所有对象之间是共享的。

通过实例化多个对象,你可以清晰地理解对象之间的独立性和类的灵活性。

7. 添加更多方法

我们已经学习了如何定义基本的方法,现在我们将进一步扩展我们的类,添加更多的方法以模拟更加复杂的行为。

为类添加新的方法

你可以为类添加任意数量的方法,这些方法可以操作对象的属性或执行特定的任务。让我们继续扩展 Car 类,添加一个 accelerate 方法,用来模拟汽车的加速。

class Car:
    def __init__(self, brand, color):
        self.brand = brand
        self.color = color
        self.speed = 0  # 初始速度为0

    def start(self):
        self.speed = 10  # 启动后设置初始速度
        print(f"The {self.color} {self.brand} car is starting at {self.speed} km/h.")

    def accelerate(self, increase):
        self.speed += increase
        print(f"The {self.color} {self.brand} car is accelerating to {self.speed} km/h.")

    def stop(self):
        self.speed = 0  # 停车时速度为0
        print(f"The {self.color} {self.brand} car is stopping.")

# 使用新的方法
car1 = Car("Toyota", "Red")
car1.start()         # 输出: The Red Toyota car is starting at 10 km/h.
car1.accelerate(30)  # 输出: The Red Toyota car is accelerating to 40 km/h.
car1.stop()          # 输出: The Red Toyota car is stopping.

代码解读:

  • speed 属性:我们添加了一个 speed 属性来跟踪汽车的速度。
  • accelerate 方法:这个方法用于增加汽车的速度。它接收一个 increase 参数,用来指定要增加的速度值。

8. 类的继承

继承是面向对象编程的一个重要特性,它允许你通过创建一个新的类,复用已有类的属性和方法。继承使得代码更加模块化、可重用和易于维护。

什么是继承?

  • 继承:当一个类(子类)继承另一个类(父类)时,子类自动拥有父类的所有属性和方法。你可以在子类中添加新的属性和方法,或者重写父类的方法。

让我们定义一个 ElectricCar 类,它继承自 Car 类,并添加一些特有的功能。

class Car:
    def __init__(self, brand, color):
        self.brand = brand
        self.color = color
        self.speed = 0

    def start(self):
        self.speed = 10
        print(f"The {self.color} {self.brand} car is starting at {self.speed} km/h.")

    def accelerate(self, increase):
        self.speed += increase
        print(f"The {self.color} {self.brand} car is accelerating to {self.speed} km/h.")

    def stop(self):
        self.speed = 0
        print(f"The {self.color} {self.brand} car is stopping.")

# 定义一个 ElectricCar 类,继承自 Car 类
class ElectricCar(Car):
    def __init__(self, brand, color, battery_capacity):
        super().__init__(brand, color)  # 调用父类的构造函数
        self.battery_capacity = battery_capacity  # 电池容量

    def charge(self):
        print(f"The {self.color} {self.brand} electric car is charging with {self.battery_capacity} kWh capacity.")

# 使用 ElectricCar 类
electric_car = ElectricCar("Tesla", "White", 85)
electric_car.start()  # 调用继承的 start 方法
electric_car.accelerate(50)  # 调用继承的 accelerate 方法
electric_car.charge()  # 调用 ElectricCar 类中特有的方法
electric_car.stop()  # 调用继承的 stop 方法

代码解读:

  • super() 函数:在 ElectricCar 类中,我们使用 super() 函数调用了父类的 __init__ 方法,以便在子类中初始化父类的属性。
  • 子类扩展ElectricCar 类扩展了 Car 类,添加了一个新的属性 battery_capacity,以及一个新的方法 charge

9.总结2

通过这几个步骤,相信你已经了解了如何实例化多个对象、添加更多的方法,以及如何使用继承来创建新的类。每个步骤都为你进一步掌握 Python 的面向对象编程打下了基础。


写在最后

.更多有关Python类和对象的详细知识,敬请期待!


以上就是关于【Python篇】Python 类和对象:详细讲解(上篇)的内容啦,各位大佬有什么问题欢迎在评论区指正,您的支持是我创作的最大动力!❤️



目录
相关文章
|
2月前
|
Python
解决Python报错:DataFrame对象没有concat属性的多种方法(解决方案汇总)
总的来说,解决“DataFrame对象没有concat属性”的错误的关键是理解concat函数应该如何正确使用,以及Pandas库提供了哪些其他的数据连接方法。希望这些方法能帮助你解决问题。记住,编程就像是解谜游戏,每一个错误都是一个谜题,解决它们需要耐心和细心。
127 15
|
2月前
|
安全 测试技术 开发者
Python中的“空”:对象的判断与比较
在Python开发中,判断对象是否为“空”是常见操作,但其中暗藏诸多细节与误区。本文系统梳理了Python中“空”的判定逻辑,涵盖None类型、空容器、零值及自定义对象的“假值”状态,并对比不同判定方法的适用场景与性能。通过解析常见误区(如混用`==`和`is`、误判合法值等)及进阶技巧(类型安全检查、自定义对象逻辑、抽象基类兼容性等),帮助开发者准确区分各类“空”值,避免逻辑错误,同时优化代码性能与健壮性。掌握这些内容,能让开发者更深刻理解Python的对象模型与业务语义交集,从而选择最适合的判定策略。
58 5
|
2月前
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
72 11
|
3月前
|
存储 C语言 Python
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
62 1
|
5月前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
238 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
6月前
|
存储 数据处理 Python
Python如何显示对象的某个属性的所有值
本文介绍了如何在Python中使用`getattr`和`hasattr`函数来访问和检查对象的属性。通过这些工具,可以轻松遍历对象列表并提取特定属性的所有值,适用于数据处理和分析任务。示例包括获取对象列表中所有书籍的作者和检查动物对象的名称属性。
96 2
|
6月前
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
138 3
|
6月前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
|
8月前
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
122 2
|
8月前
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
73 1

推荐镜像

更多