python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python类定义与实例化

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 类,它包含了:

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

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

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

实例化语法

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}"

重点说明:

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 来可视化一个简单的类结构:

这张图展示了:

你可以将这段 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

总结:

特殊方法(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)

总结:类的终极价值 

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

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

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

您可能感兴趣的文章:
阅读全文