Skip to main content

Python 面向对象

Python 类和实例

在 Python 中,面向对象编程(OOP)是一种强大的编程方式,它允许我们将代码组织成可重用的模块化组件。类和实例是OOP的核心概念。本章节将详细讲解Python中类和实例的基础知识。我们将从定义类开始,逐步介绍如何创建实例并使用它们。

1. 什么是类和实例?

在Python中,类(Class) 是一个用于创建对象的模板,而 实例(Instance) 是根据这个类创建的特定对象。类定义了对象的属性(数据)和方法(行为),而实例则是类的具体实现。

例如,假设我们有一个“狗”的类,它可以定义狗的属性(如名字和年龄)和行为(如吠叫)。每只具体的狗(如“Buddy”或“Max”)就是这个类的一个实例。

2. 如何定义一个类

在Python中,我们使用 class 关键字来定义一个类。类名通常使用大驼峰命名法(CamelCase)。在类内部,我们可以定义属性和方法。

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

class Dog:
    def bark(self):
        print("汪汪!")

在这个例子中:

  • class Dog: 定义了一个名为 Dog 的类。
  • bark 是一个方法,self 是方法的第一个参数,表示调用该方法的实例本身(这是Python的惯例)。

3. 创建类的实例

定义好类后,我们可以通过类名加括号来创建实例,并将其赋值给变量。实例是一个独立的对象,拥有类中定义的属性和方法。

以下是如何创建 Dog 类实例的示例:

class Dog:
    def bark(self):
        print("汪汪!")

my_dog1 = Dog()
my_dog1.bark()  # 输出: 汪汪!
print(my_dog1)  # <__main__.Dog object at 0x1044b1b10>

my_dog2 = Dog()
my_dog2.bark()  # 输出: 汪汪!
print(my_dog2)  # <__main__.Dog object at 0x10462a490>

在这里:

  • my_dog1 = Dog() 创建了一个 Dog 类的实例,并赋值给变量 my_dog1
  • 使用点号(.)调用实例的 bark 方法,输出“汪汪!”。
  • my_dog1my_dog2 是两个不同的实例,从输出的实例地址不同就可以区分

4. 访问属性和方法

实例的属性和方法可以通过点号(.)访问。方法是类的函数,而属性是与实例相关的数据。

让我们扩展一下示例:

class Dog:
    def bark(self):
        print("汪汪!")

    def wag_tail(self):
        print("尾巴摇摇!")

my_dog = Dog()
my_dog.bark()      # 输出: 汪汪!
my_dog.wag_tail()  # 输出: 尾巴摇摇!

在这个例子中,my_dog 调用了两个方法:barkwag_tail

5. 使用 __init__ 方法初始化实例

__init__ 是一个特殊方法,也称为构造函数。当创建新实例时,Python会自动调用它来初始化实例的属性。我们可以在 __init__ 中定义实例特定的数据。

以下是一个带有 __init__ 方法的示例:

class Dog:
    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age    # 实例属性

    def bark(self):
        print(f"{self.name} 说:汪汪!")

my_dog = Dog("Buddy", 3)
print(my_dog.name)  # 输出: Buddy
print(my_dog.age)   # 输出: 3
my_dog.bark()       # 输出: Buddy 说:汪汪!

在这个例子中:

  • __init__ 方法接受 nameage 两个参数(第一个不需要传),并将它们保存为实例属性(self.nameself.age)。
  • 函数中的第一个参数 self 表示调入此函数的实例本身,比如当调用 my_dog.name,时 self 就是 my_dog
  • 创建实例时需要传入参数:Dog("Buddy", 3)
  • 使用点号访问属性(如 my_dog.name)或调用方法(如 my_dog.bark())。

6. 类属性与实例属性的区别

在 Python 中,属性可以分为 类属性实例属性

  • 类属性:定义在类内部但在方法外部,属于类本身,所有实例共享。
  • 实例属性:定义在 __init__ 方法中,使用 self 指定,每个实例独立拥有。

以下是两者的对比示例:

class Dog:
    species = "犬科"  # 类属性,即所有的 Dog 都是 犬科

    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age    # 实例属性

    def bark(self):
        print(f"{self.name} 说:汪汪!")

dog1 = Dog("Buddy", 3)
dog2 = Dog("Max", 5)

print(dog1.species)  # 输出: 犬科
print(dog2.species)  # 输出: 犬科
print(dog1.name)     # 输出: Buddy
print(dog2.name)     # 输出: Max

在这个例子中:

  • species 是类属性,所有 Dog 实例共享。
  • nameage 是实例属性,每个实例有自己的值。
  • 如果通过实例修改类属性(如 dog1.species = "狼"),只会为该实例创建一个新的实例属性,而类属性保持不变。

7. 关于继承的简要说明

继承是面向对象编程中的一个重要特性,允许一个类从另一个类继承属性和方法,从而实现代码重用。例如,我们可以创建一个 Puppy 类,继承 Dog 类的功能。不过,继承将在后续章节中详细讲解,这里仅作提及。

总结

在本教程中,我们学习了Python中类和实例的基础知识:

  • 是对象的模板,使用 class 关键字定义。
  • 实例 是类的具体对象,通过类名创建。
  • 使用 __init__ 方法初始化实例属性。
  • 类属性属于类,实例属性属于每个实例。