Python进阶指南之类的定义与实例化完整教学

 更新时间:2026年07月31日 08:58:24   作者:知远漫谈  
在 Python 的世界里,class 不仅仅是一个语法结构,它是构建复杂系统、实现面向对象编程(OOP)的核心工具,本文我们就来深入探讨 类的定义与实例化,并用大量代码示例带你从零开始掌握这一核心技能

在 Python 的世界里,class 不仅仅是一个语法结构,它是构建复杂系统、实现面向对象编程(OOP)的核心工具。通过类,我们可以创建自定义数据类型,让程序不仅仅是处理数字和字符串,而是能表达现实世界中的概念,比如“汽车”、“用户”、“订单”等。今天,我们就来深入探讨 类的定义与实例化,并用大量代码示例带你从零开始掌握这一核心技能。

什么是类?—— 自定义数据类型的蓝图 

在现实生活中,我们看到一辆车,会说:“这是一辆特斯拉”。但如果我们想在代码中表示“一辆特斯拉”,该怎么办?直接用 str("Tesla")?还是用 dict(model="Model S", brand="Tesla")

虽然这些方式可行,但它们缺乏语义性可扩展性。而类正是为了解决这个问题而诞生的。

类(Class) 是一种模板或蓝图,用于定义具有相同属性和行为的对象。

想象一下,你正在设计一个“学生”系统。每个学生都有名字、年龄、成绩等信息,并且可以进行“学习”、“考试”等操作。这时候,就可以定义一个 Student 类:

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.grades = []

    def add_grade(self, grade):
        self.grades.append(grade)

    def get_average(self):
        if not self.grades:
            return 0
        return sum(self.grades) / len(self.grades)

    def study(self):
        print(f"{self.name} is studying hard! 📚")

这段代码定义了一个 Student 类,它包含了:

  • 属性(Attributes)name, age, grades
  • 方法(Methods)add_grade(), get_average(), study()

现在,我们可以通过这个类创建多个“学生”对象,每一个都是独立的实例。

实例化:从蓝图到真实对象

类是蓝图,但只有当你“实例化”它时,才会真正生成一个对象。实例化就是使用类来创建一个具体的对象。

实例化语法

student1 = Student("Alice", 20)
student2 = Student("Bob", 22)

这里,student1student2 就是两个独立的 Student 对象。它们都拥有相同的属性结构,但值不同。

检查实例的属性

print(student1.name)  # Alice
print(student2.age)   # 22

student1.add_grade(85)
student1.add_grade(90)
print(f"Average: {student1.get_average()}")  # Average: 87.5

注意:每个实例都有自己的一套属性副本,互不影响。

__init__方法:构造函数的魔法

__init__ 是类中最关键的方法之一,也被称为构造函数。它在每次创建新实例时自动调用。

class Car:
    def __init__(self, brand, model, year):
        self.brand = brand
        self.model = model
        self.year = year
        self.mileage = 0
        self.is_running = False

    def start_engine(self):
        self.is_running = True
        print(f"{self.brand} {self.model} engine started! 🚗💨")

    def drive(self, miles):
        if self.is_running:
            self.mileage += miles
            print(f"Drove {miles} miles. Total mileage: {self.mileage}")
        else:
            print("Engine is off! Start the car first.")

    def __str__(self):
        return f"{self.year} {self.brand} {self.model}"

重点说明:

  • __init__ 接收参数,并将它们赋值给 self
  • self 指代当前实例,是所有实例方法的第一个参数。
  • __str__ 是一个特殊方法,用于定义对象的字符串表示形式。
my_car = Car("Toyota", "Camry", 2023)
print(my_car)  # 2023 Toyota Camry
my_car.start_engine()
my_car.drive(100)

输出:

2023 Toyota Camry
Toyota Camry engine started! 🚗💨
Drove 100 miles. Total mileage: 100

类属性 vs 实例属性:谁属于谁?

理解类属性和实例属性的区别,是进阶的关键。

属性类型定义位置共享性示例
实例属性__init__ 中定义每个实例独立self.name
类属性在类内部、方法外部定义所有实例共享Car.total_cars = 0

实例属性:每个对象独有

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

类属性:全类共享

class Dog:
    species = "Canis lupus familiaris"  # 类属性

    def __init__(self, name, breed):
        self.name = name
        self.breed = breed

    def bark(self):
        print(f"{self.name} says: Woof! 🐶")

# 所有实例共享 species
dog1 = Dog("Buddy", "Golden Retriever")
dog2 = Dog("Max", "Labrador")

print(dog1.species)  # Canis lupus familiaris
print(dog2.species)  # Canis lupus familiaris

# 可以通过类名修改
Dog.species = "Canis familiaris"
print(dog1.species)  # Canis familiaris

注意:如果在实例上修改类属性,会创建一个同名的实例属性,遮蔽类属性。

dog1.species = "New Species"
print(dog1.species)  # New Species (实例属性)
print(dog2.species)  # Canis familiaris (类属性未变)

使用 Mermaid 绘制类关系图

让我们用 Mermaid 来可视化一个简单的类结构:

这张图展示了:

  • Animal 是基类(父类)
  • DogCat 继承自 Animal
  • 继承关系用 <|-- 表示

你可以将这段 Mermaid 代码粘贴到 Mermaid Live Editor 网站中实时预览图形效果。

方法类型:实例方法、类方法、静态方法

实例方法(Instance Method)

最常见的一种方法,第一个参数是 self,只能由实例调用。

def introduce(self):
    return f"I am {self.name}, a {self.breed}."

类方法(Class Method)

@classmethod 装饰器定义,第一个参数是 cls,代表类本身。

常用于工厂模式或创建替代构造函数。

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height

    @classmethod
    def from_square(cls, side_length):
        return cls(side_length, side_length)

    def area(self):
        return self.width * self.height

# 用类方法创建正方形
square = Rectangle.from_square(5)
print(square.area())  # 25

静态方法(Static Method)

@staticmethod 装饰器定义,不接收 selfcls,像普通函数一样使用。

适合封装与类相关的工具函数。

class MathUtils:
    @staticmethod
    def add(a, b):
        return a + b

    @staticmethod
    def is_even(n):
        return n % 2 == 0

print(MathUtils.add(3, 4))      # 7
print(MathUtils.is_even(6))     # True

总结:

  • instance method: 用 self,操作实例
  • class method: 用 cls,操作类
  • static method: 无上下文,纯工具函数

特殊方法(Magic Methods)—— 让类更 Pythonic

Python 提供了一系列以双下划线开头和结尾的方法,称为“魔术方法”(Magic Methods),让你可以自定义对象的行为。

方法用途
__str__()定义 print(obj) 的输出
__repr__()定义调试时的字符串表示
__len__()支持 len(obj)
__eq__()支持 == 比较
__add__()支持 + 操作

示例:自定义向量类

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return f"Vector({self.x}, {self.y})"

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

    def __len__(self):
        return 2

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def magnitude(self):
        return (self.x**2 + self.y**2)**0.5

# 测试
v1 = Vector(3, 4)
v2 = Vector(1, 2)

print(v1)           # Vector(3, 4)
print(len(v1))      # 2
print(v1 == v2)     # False
print(v1 + v2)      # Vector(4, 6)
print(v1.magnitude())  # 5.0

有了这些方法,你的类就真正“融入”了 Python 的生态系统!

封装:保护数据安全

封装是 OOP 的三大支柱之一(封装、继承、多态)。通过私有属性和方法,防止外部随意修改内部状态。

私有属性(命名约定)

Python 没有真正的私有访问控制,但通过命名约定表示“私有”。

  • 单下划线 _:受保护,建议不要直接访问
  • 双下划线 __:名称改写,外部无法直接访问
class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self._balance = balance  # 受保护
        self.__pin = "1234"      # 私有

    def deposit(self, amount):
        if amount > 0:
            self._balance += amount
            print(f"Deposited {amount}. New balance: {self._balance}")

    def withdraw(self, amount, pin):
        if pin == self.__pin and amount <= self._balance:
            self._balance -= amount
            print(f"Withdrew {amount}. Remaining: {self._balance}")
        else:
            print("Invalid PIN or insufficient funds.")

    def get_balance(self):
        return self._balance

    def __str__(self):
        return f"Account of {self.owner}: ${self._balance}"

# 用法
account = BankAccount("Alice", 1000)
account.deposit(500)
account.withdraw(200, "1234")
print(account)  # Account of Alice: $1300

但注意:__pin 被改名为 _BankAccount__pin,仍可通过 account._BankAccount__pin 访问,因此不能完全隐藏。

继承:代码复用的利器

继承允许你创建一个新类,基于已有类,继承其属性和方法。

class Vehicle:
    def __init__(self, brand, model):
        self.brand = brand
        self.model = model

    def start(self):
        print(f"{self.brand} {self.model} is starting...")

    def stop(self):
        print(f"{self.brand} {self.model} is stopping...")

class ElectricCar(Vehicle):
    def __init__(self, brand, model, battery_capacity):
        super().__init__(brand, model)
        self.battery_capacity = battery_capacity

    def charge(self):
        print(f"Charging {self.brand} {self.model}... Battery: {self.battery_capacity}%")

    def start(self):  # 重写父类方法
        print(f"Silent start: {self.brand} {self.model} powered by electricity! 🌿")

# 使用
tesla = ElectricCar("Tesla", "Model 3", 90)
tesla.start()        # Silent start: Tesla Model 3 powered by electricity! 🌿
tesla.charge()       # Charging Tesla Model 3... Battery: 90%
tesla.stop()         # Tesla Model 3 is stopping...

super() 用于调用父类方法,避免重复代码。

多态:同一接口,多种实现

多态是指同一个方法,在不同类中表现出不同行为。

class Shape:
    def area(self):
        raise NotImplementedError("Subclasses must implement area()")

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14159 * self.radius ** 2

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

# 多态演示
shapes = [Circle(5), Rectangle(4, 6)]

for shape in shapes:
    print(f"Area: {shape.area()}")  # 78.53975, 24

同一调用 area(),但根据实际类型执行不同逻辑。

实战案例:简易博客系统

我们来构建一个完整的类系统,模拟一个博客平台。

class Post:
    def __init__(self, title, content, author):
        self.title = title
        self.content = content
        self.author = author
        self.likes = 0
        self.comments = []

    def like(self):
        self.likes += 1
        print(f"👍 {self.author} liked '{self.title}'!")

    def add_comment(self, comment):
        self.comments.append(comment)
        print(f"💬 Comment added to '{self.title}'")

    def __str__(self):
        return f"📝 {self.title} by {self.author} ({self.likes} likes)"

# 博客管理器
class Blog:
    def __init__(self):
        self.posts = []

    def create_post(self, title, content, author):
        post = Post(title, content, author)
        self.posts.append(post)
        print(f"✅ Post '{title}' created!")
        return post

    def display_all_posts(self):
        for post in self.posts:
            print(post)

# 测试
blog = Blog()
post1 = blog.create_post("My First Post", "Hello world!", "Alice")
post1.like()
post1.add_comment("Great post!")
blog.display_all_posts()

输出:

✅ Post 'My First Post' created!
👍 Alice liked 'My First Post'!
💬 Comment added to 'My First Post'
📝 My First Post by Alice (1 likes)

总结:类的终极价值 

通过本篇教程,我们掌握了:

  • 如何定义类
  • 如何实例化对象
  • __init__ 构造函数的作用
  • 属性分类(实例/类)
  • 方法类型(实例/类/静态)
  • 特殊方法(__str__, __eq__ 等)
  • 封装与私有机制
  • 继承与多态
  • 实战项目应用

类的本质:把“数据”和“行为”打包成一个整体,让你的代码更清晰、可维护、可扩展。

以上就是Python进阶指南之类的定义与实例化完整教学的详细内容,更多关于Python类定义与实例化的资料请关注脚本之家其它相关文章!

相关文章

  • Pygame与OpenCV联合播放视频并保证音画同步

    Pygame与OpenCV联合播放视频并保证音画同步

    Pygame的Movie模块已经废弃多年,本文主要介绍了Pygame与OpenCV联合播放视频并保证音画同步,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Python3基础之函数用法

    Python3基础之函数用法

    这篇文章主要介绍了Python3的函数用法,非常重要,需要的朋友可以参考下
    2014-08-08
  • Python进行图片验证码识别方法步骤

    Python进行图片验证码识别方法步骤

    这篇文章主要给大家介绍了关于Python进行图片验证码识别的相关资料,基于Python和OpenCV的验证码识别系统具有重要的研究意义和实际应用价值,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • python生成xml时规定dtd实例方法

    python生成xml时规定dtd实例方法

    在本篇文章里小编给大家整理的是关于python生成xml时规定dtd实例方法,需要的朋友们学习参考下。
    2020-09-09
  • Pytorch 的 LSTM 模型的示例教程

    Pytorch 的 LSTM 模型的示例教程

    本文给大家介绍了Pytorch 的 LSTM 模型的示例教程,文中结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-06-06
  • python 通过字符串调用对象属性或方法的实例讲解

    python 通过字符串调用对象属性或方法的实例讲解

    下面小编就为大家分享一篇python 通过字符串调用对象属性或方法的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python实现用户登录注册

    Python实现用户登录注册

    这篇文章主要为大家详细介绍了Python实现用户登录注册,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Async IO在Python中的异步编程工作实例解析

    Async IO在Python中的异步编程工作实例解析

    这篇文章主要为大家介绍了Async IO在Python中的异步编程工作实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Python 中如何使用 virtualenv 管理虚拟环境

    Python 中如何使用 virtualenv 管理虚拟环境

    这篇文章主要介绍了Python 中使用 virtualenv 管理虚拟环境的方法,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-01-01
  • 使用NumPy和pandas对CSV文件进行写操作的实例

    使用NumPy和pandas对CSV文件进行写操作的实例

    今天小编就为大家分享一篇使用NumPy和pandas对CSV文件进行写操作的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06

最新评论