当前位置: 代码网 > it编程>前端脚本>Python > Python进阶指南之类的定义与实例化完整教学

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

2026年07月31日 Python 我要评论
在 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类定义与实例化的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com