10. 面向对象编程
10.2 类

基本概念

在上一节中,我们讲解了“对象”的概念,以及对象在 Python 中的使用,其中涉及到了“类”的概念,那么,本节将重点解释什么是“类”,以及如何在 Python 中使用类。

什么是类?

在 Python 中,类是创建对象的蓝图或模板。它定义了这些对象的结构和行为。我们可以将类视为创建某种类型对象的蓝图。

这段话也许不好理解。那么,让我们用一些现实生活中的例子来解释一下。

示例 1. 建筑蓝图:

  • 类: 想象一个类是一栋房子的建筑蓝图。它定义了房屋的结构(房间数量、大小和布局)和行为(每个房间内可以做什么)。
  • 对象: 该类的实例就是按照该蓝图建造的实际房屋。每栋房屋都具有其独特的属性(例如油漆颜色、家具),但都遵循蓝图(类)中定义的相同总体结构和功能。

示例 2. 蛋糕食谱:

  • 类: 将类比为蛋糕食谱。它规定了制作蛋糕所需的配料(属性)和烘烤蛋糕的步骤(方法)。
  • 对象: 该类的实例就是根据该食谱烘焙的实际蛋糕。每个蛋糕可能具有不同的口味或装饰(独特属性),但它们都遵循蛋糕食谱(类)来烘烤。

示例 3. 车辆制造:

  • 类: 将类视为用于制造车辆(例如汽车)的模板。它定义了所有该类型车辆应具有的共同特征(属性)和操作(方法),如轮子、发动机以及启动/停止机制。
  • 对象: 工厂生产的每辆汽车都是该类的实例。尽管它们可能具有不同的颜色、型号或附加功能(独特属性),但它们都遵循汽车模板(类)定义的基本结构和功能。

通过上面几个示例,我们可以看到:类就是充当了定义通用结构和行为的蓝图或模板,而对象代表根据该蓝图创建的具体实例,具有其独特的特征。

如何定义类

在 Python 中,我们使用 class 关键字来定义类。具体语法规则如下:

class 类名:
    # 类属性(可选)
 
    def __init__(self, 参数1, 参数2, ...):
        # 构造方法(可选)
        # 初始化实例属性
 
    def 方法1(self, 参数1, 参数2, ...):
        # 方法1定义
 
    def 方法2(self, 参数1, 参数2, ...):
        # 方法2定义
 
    # 其他方法和属性(可选)

其中:

  1. class 类名::这一行用于类的定义。类名就是我们选择的类名称。按照惯例,Python 中的类名称使用 CamelCase 编写,以大写字母开头。
  2. 类属性(可选):我们可以定义类级别的属性,这些属性在类的所有实例之间共享。这些属性直接放在class语句下方,但不在任何方法内定义。
  3. def __init__(self, 参数1, 参数2, ...)::这是类的构造方法,也是可选的。__init__方法是一个特殊的方法,用于在创建对象时初始化对象的实例属性。当创建一个类的对象时,它会自动被调用。self 引用正在创建的实例,而参数是我们希望传递给实例属性的初始值。
  4. 实例属性:在__init__方法内部,我们可以使用 self.属性名 = 初始值 来初始化实例属性。这些属性存储了每个类实例的唯一数据。
  5. 方法:我们可以在类内定义多个方法。方法是使用类的属性执行操作或计算的函数。它们使用 def 关键字定义,后跟方法名称和参数。方法的第一个参数通常是 self,它引用了调用该方法的实例。
  6. 其他方法和属性(可选):我们可以在类内定义尽可能多的方法和属性,以封装与类创建的对象相关的行为和数据。

以下是一个简单的 Person 类定义示例:

class Person:
    # 类属性
    kind = "Homo sapiens"
 
	def __init__(self, name, age):
		# 实例属性
        self.name = name
        self.age = age
 
    def greet(self):
        return f"你好,我叫{self.name},我今年{self.age}岁。"
 

在这个示例中,我们定义了一个 Person 类,其中包含一个类属性(kind)、两个实例属性(nameage)和一个方法(greet)。

如何使用类

在完成类的定义后,我们就可以创建该类的对象了。每个对象都表示该类的一个特定实例,具有自己的属性,并可以执行类中定义的方法。

例如:

# 创建Person类的实例
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)
 
# 访问属性
print(person1.name)  # 输出: "Alice"
print(person2.age)   # 输出: 25
 
# 调用方法
print(person1.greet())  # 输出: "你好,我叫Alice,我今年30岁。"
print(person2.greet())  # 输出: "你好,我叫Bob,我今年25岁。"

类与对象的区别和联系

在 Python 编程中,类与对象是不同层次的概念。让我们通过示例来解释类和对象之间的区别。

类(Class):

  • 类是创建对象的蓝图或模板。
  • 它定义了对象的结构和行为。
  • 类封装了对象的属性(数据)和方法(函数)。
  • 类作为创建具有相似属性和行为的多个对象的蓝图。

对象(Object):

  • 对象是基于类蓝图创建的实例。
  • 它代表具有独特属性和方法的特定类实例。
  • 对象用于与和操作类中定义的数据。
  • 您可以从同一类创建多个对象,每个对象都有其独特的数据。

让我们再用一个示例来说明这一点:

# 定义一个名为“Car”的类
class Car:
    def __init__(self, make, model):
        self.make = make
        self.model = model
 
    def start(self):
        return f"{self.make} {self.model} 启动了。"
 
# 创建“Car”类的对象(实例)
car1 = Car("Toyota", "Camry")
car2 = Car("Honda", "Civic")

在这个示例中:

  • Car 是一个类,定义了创建汽车的蓝图。
  • car1car2Car 类的对象(实例)。它们代表两辆具体的汽车,一辆是丰田卡罗拉,一辆是本田思域。
  • 每个对象(car1car2)都有自己的属性(makemodel)并具有唯一的值。
  • 对象还可以访问类中定义的方法,例如 start 方法。

现在,如果我们访问这些对象的属性和方法:

print(car1.make)       # 输出: "Toyota"
print(car2.model)      # 输出: "Civic"
print(car1.start())    # 输出: "Toyota Camry 启动了。"
print(car2.start())    # 输出: "Honda Civic 启动了。"

我们可以看到,从 Car 类创建的每个对象(汽车)都有其自己独特的属性(makemodel),并且可以执行类中定义的相同方法(start)。这说明了类(蓝图)和对象(基于蓝图创建的实例)之间的基本区别和联系。

总结

综上所述,在 Python 中,类可以看作是创建对象的蓝图或模板。它定义了对象的结构和行为。一个类封装了对象的属性(数据)和方法(函数)。我们可以将类视为一种设计规划,它规定了对象应该如何创建以及它们应该具有哪些属性和方法。

而对象则是类的实例,每个对象代表了该蓝图的独特实现。对象具有自己独特的属性,并可以执行类中定义的方法。

在 Python 中,类是面向对象编程的基础,有助于组织代码、实现可重用性,并封装数据和功能。它们提供了一种强大的方式来建模现实世界的概念,并创建结构化、易维护和灵活的软件系统。