You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类(Object)与函数的核心差异是什么?

类与函数的核心差异:从你的示例说起

这问题问得太到位了——我刚学面向对象的时候也对着类似的代码发懵,毕竟从表面看,你写的这两个bank示例确实几乎一模一样!但只要稍微延伸一下功能,两者的核心区别就立刻显现出来了。

1. 本质定位:对象蓝图 vs 任务执行单元

你的类bank本质是创建对象的模板,调用它(bank(...))会生成一个独立的「银行账户对象」,这个对象是能长久存在的实体,里面的属性(acc_num、acc_name等)会跟着对象走;而函数bank只是一段执行特定操作的代码块,调用它时会临时创建局部变量,函数执行完毕后这些变量就会被销毁,除非你主动把它们返回出去。

比如试试延伸你的代码:

# 类的用法:创建对象后,随时能访问属性
my_account = bank(12345, "KGGaming Fluff", "2000-05-20")
print(my_account.acc_name)  # 输出: KGGaming Fluff

# 函数的用法:执行完就没了,没法访问内部变量
bank(12345, "KGGaming Fluff", "2000-05-20")
# 这里根本拿不到acc_name,因为函数执行完变量就被回收了

2. 核心能力:维护状态 vs 一次性操作

类的最大优势是能维护对象的状态——也就是数据可以随着对象的生命周期持续更新。比如给你的bank类加一个余额属性和存款方法:

class bank(object):
    def __init__(self, acc_num, acc_name, acc_DOB):
        self.acc_num = acc_num
        self.acc_name = acc_name
        self.acc_DOB = acc_DOB
        self.balance = 0  # 初始余额

    def deposit(self, amount):
        self.balance += amount
        print(f"存入{amount}元,当前余额:{self.balance}")

现在你可以创建一个账户,反复存款,它会记住自己的余额:

my_account = bank(12345, "KGGaming Fluff", "2000-05-20")
my_account.deposit(100)  # 输出: 存入100元,当前余额:100
my_account.deposit(200)  # 输出: 存入200元,当前余额:300

而函数要实现类似功能,只能靠外部变量(比如全局变量)或者闭包,不仅麻烦,还很难同时维护多个独立的状态(比如10个不同的银行账户):

# 用函数模拟的话,得手动跟踪每个账户的余额
def deposit(current_balance, amount):
    new_balance = current_balance + amount
    print(f"存入{amount}元,当前余额:{new_balance}")
    return new_balance

# 维护一个账户的余额都要手动存变量
balance = 0
balance = deposit(balance, 100)
balance = deposit(balance, 200)

3. 设计逻辑:封装行为与数据 vs 单一功能

类可以把数据(属性)和操作数据的行为(方法)封装在一起,让代码更内聚、更易理解。比如你的银行账户类,除了存款,还可以加取款、查询余额的方法,所有和账户相关的逻辑都在类里,一目了然。

而函数是单一功能的单元,每个函数只做一件事,如果你有多个相关操作,就得写多个独立的函数,还要手动传递数据,代码的关联性会弱很多。

4. 扩展能力:继承与多态 vs 函数组合

类支持继承——你可以基于现有的bank类创建更具体的子类,比如储蓄账户、信用卡账户,复用父类的功能同时扩展新特性:

class SavingsBank(bank):
    def add_interest(self, rate):
        interest = self.balance * rate
        self.balance += interest
        print(f"添加利息{interest}元,当前余额:{self.balance}")

savings_acc = SavingsBank(67890, "KGGaming Fluff", "2000-05-20")
savings_acc.deposit(1000)
savings_acc.add_interest(0.02)  # 输出: 添加利息20元,当前余额:1020

这种层级化的功能复用和扩展,是函数完全做不到的——虽然你可以把多个函数组合起来用,但永远达不到类的继承体系那么清晰、可维护。

总结一下

  • 当你需要创建多个有独立状态、能执行相关操作的实体时,用类——比如银行账户、用户、商品这些真实世界的对象;
  • 当你只需要执行一个特定的计算或一次性操作,不需要维护状态时,用函数——比如计算两个数的和、格式化字符串。

回到你最开始的示例,它们看起来功能相同,是因为你只用到了类最基础的初始化功能,一旦涉及到状态维护、行为封装,两者的差异就会非常明显。

内容的提问来源于stack exchange,提问作者KGGaming Fluff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 01:12:35