Python 创建一个类并实例化它(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在 Python 编程中,面向对象编程(OOP)是构建复杂程序的核心工具。无论是开发 Web 应用、数据分析工具,还是游戏引擎,理解如何创建一个类并实例化它都是开发者必备的技能。本文将通过循序渐进的方式,结合生动的比喻和实际案例,帮助读者掌握这一基础但关键的概念。无论您是编程新手还是有一定经验的开发者,都能在本文中找到适合自己的学习路径。


类与对象的基础概念

什么是类?

可以将类(Class)想象为一个蓝图或模板,它定义了对象的共同属性和行为。例如,如果我们要设计一个“汽车”类,这个蓝图会包含汽车的通用特征(如颜色、品牌、速度)和功能(如加速、刹车)。

类的核心组成部分包括:

  1. 属性(Attributes):描述对象的状态,例如 nameage
  2. 方法(Methods):定义对象能执行的操作,例如 speak()move()

比喻
如果类是“工厂”,那么它生产的“产品”就是对象。例如,Car 类是工厂,而 toyota = Car() 就是一个具体的产品实例。


什么是对象?

对象(Object)是类的具体实例。通过实例化(Instantiation)操作,我们可以从类中生成不同的对象,每个对象拥有独立的属性值和方法。

关键区别
| 类(Class) | 对象(Object) |
|-------------|----------------|
| 蓝图或模板 | 具体实例 |
| 定义属性和方法 | 拥有属性和方法的具体值 |
| 不占用内存空间 | 占用内存空间 |


从零开始编写第一个类

第一步:定义一个简单的类

在 Python 中,使用 class 关键字创建类。以下是一个最基础的示例:

class Animal:  
    def __init__(self):  
        self.type = "Mammal"  
        self.legs = 4  

    def make_sound(self):  
        print("Generic animal sound!")  

代码解析

  • __init__ 方法是构造函数,在对象被创建时自动调用。
  • self 是指向当前对象的引用,必须作为方法的第一个参数。
  • make_sound() 是一个普通方法,用于定义对象的行为。

第二步:实例化类并调用方法

通过类名后加括号的方式,可以生成对象的实例:

dog = Animal()  
print(dog.type)        # 输出:Mammal  
dog.make_sound()       # 输出:Generic animal sound!  

此时,dog 对象继承了 Animal 类的属性和方法。每个实例都是独立的,例如:

cat = Animal()  
cat.type = "Felidae"  
print(cat.type)        # 输出:Felidae  
print(dog.type)        # 仍输出:Mammal  

进阶技巧:参数化构造函数

为什么需要构造函数参数?

默认的 __init__ 方法可能无法满足需求。例如,我们希望在创建对象时指定初始属性值。

class Person:  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  

    def introduce(self):  
        print(f"My name is {self.name}, and I'm {self.age} years old.")  

实例化时传递参数

alice = Person("Alice", 30)  
alice.introduce()    # 输出:My name is Alice, and I'm 30 years old.  

动态修改属性与方法

对象的属性和方法在实例化后仍可修改:

alice.age = 31  
alice.introduce()    # 输出:My name is Alice, and I'm 31 years old.  

def new_introduce(self):  
    print(f"Hello, I'm {self.name}!")  

import types  
alice.introduce = types.MethodType(new_introduce, alice)  
alice.introduce()    # 输出:Hello, I'm Alice!  

实战案例:银行账户管理系统

需求分析

设计一个 BankAccount 类,具备以下功能:

  • 存款、取款、查询余额
  • 防止透支(余额不能为负数)
class BankAccount:  
    def __init__(self, owner, balance=0):  
        self.owner = owner  
        self.balance = balance  

    def deposit(self, amount):  
        if amount > 0:  
            self.balance += amount  
            print(f"Deposited {amount}元. New balance: {self.balance}元")  
        else:  
            print("Deposit amount must be positive!")  

    def withdraw(self, amount):  
        if 0 < amount <= self.balance:  
            self.balance -= amount  
            print(f"Withdrew {amount}元. New balance: {self.balance}元")  
        else:  
            print("Insufficient funds or invalid amount!")  

    def get_balance(self):  
        return self.balance  

使用示例

account = BankAccount("John", 1000)  
account.deposit(500)        # 输出:Deposited 500元. New balance: 1500元  
account.withdraw(2000)      # 输出:Insufficient funds or invalid amount!  

类的继承与多态性

继承:复用代码的利器

通过继承,子类可以继承父类的属性和方法,并在此基础上进行扩展或修改。

class SavingsAccount(BankAccount):  
    def __init__(self, owner, balance, interest_rate):  
        super().__init__(owner, balance)  
        self.interest_rate = interest_rate  

    def add_interest(self):  
        interest = self.balance * self.interest_rate  
        self.deposit(interest)  

继承的优势

  • 代码复用:无需重复编写 depositwithdraw 等方法。
  • 扩展性:子类可添加新功能(如 add_interest)。
savings = SavingsAccount("Alice", 2000, 0.05)  
savings.add_interest()     # 自动调用父类的 deposit 方法  
print(savings.get_balance())  # 输出:2100.0  

多态性:灵活的行为定义

多态性允许不同子类对同一方法提供不同实现。例如:

class CheckingAccount(BankAccount):  
    def __init__(self, owner, balance, overdraft_limit=500):  
        super().__init__(owner, balance)  
        self.overdraft_limit = overdraft_limit  

    def withdraw(self, amount):  
        if amount <= self.balance + self.overdraft_limit:  
            self.balance -= amount  
            print(f"Withdrew {amount}元. New balance: {self.balance}元")  
        else:  
            print("Exceeds overdraft limit!")  
checking = CheckingAccount("Bob", 800, 500)  
checking.withdraw(1000)    # 允许取款,余额变为 -200  

常见问题与最佳实践

问题 1:为什么需要 self

self 是 Python 中强制显式引用当前对象的语法要求。它帮助区分实例属性和局部变量,例如:

class Counter:  
    def __init__(self):  
        self.count = 0  

    def increment(self):  
        self.count += 1  # 正确引用实例属性  
        # count += 1      # 报错:局部变量未定义  

问题 2:如何避免重复代码?

  • 继承:通过父类集中管理通用功能。
  • 组合:将功能模块化为独立类,通过实例化后引用。
class Logger:  
    def log(self, message):  
        print(f"LOG: {message}")  

class Vehicle:  
    def __init__(self):  
        self.logger = Logger()  

    def start_engine(self):  
        self.logger.log("Engine started")  

最佳实践

  1. 命名规范:类名使用大驼峰(如 BankAccount),方法和属性用小蛇形(如 deposit_amount)。
  2. 文档字符串:为类和方法添加 docstring,说明用途和参数。
  3. 私有属性:通过单下划线(_private_attr)表示内部使用,避免外部直接访问。

结论

通过本文的讲解,我们掌握了 Python 中创建一个类并实例化它的核心方法。从基础的类定义到复杂的继承与多态性应用,每个步骤都通过案例和代码示例进行了详细说明。

对于初学者,建议从简单案例入手,逐步实践继承和封装等进阶概念;中级开发者则可进一步探索抽象类、装饰器等高级特性。记住,面向对象编程的本质是通过抽象和模块化,让代码更清晰、可维护

掌握这一技能后,您可以尝试更复杂的项目,例如:

  • 开发一个学生管理系统(使用类存储学生信息)
  • 构建图形界面应用(利用对象事件驱动机制)
  • 实现数据结构(如链表、树等)

持续实践与探索,您将逐渐成长为一名熟练的 Python 开发者!

最新发布