21番茄网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 21番茄网
查看: 20|回复: 2

python中,class类和def函数有什么区别,用通俗易懂的类比方法来解释

[复制链接]

724

主题

946

帖子

3134

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3134
发表于 前天 08:20 | 显示全部楼层 |阅读模式
要理解 Python 中class(类)和def(函数)的区别,我们可以用日常生活中的 "工具" 和 "工厂" 来类比:
1. def 函数:像一个专门的工具
比如一把 "榨汁机":
  • 有明确的用途(榨水果)
  • 输入原料(水果),输出结果(果汁)
  • 每次使用都是独立的,用完就结束

函数也是如此:
def 榨果汁(水果):
    切碎(水果)
    搅拌(水果)
    return 果汁

# 使用时直接调用,给原料出结果
苹果汁 = 榨果汁(苹果)


2. class 类:像一个 "工厂"
比如一个 "饮料工厂":
  • 不仅有生产工具(类似函数的功能)
  • 还有自己的仓库(存储数据的变量)
  • 能持续生产多种产品,还能记录生产状态

类也是如此:
class 饮料工厂:
    # 仓库(存储数据)
    原料库存 = []
    产品库存 = []
    
    # 生产工具(类似函数,称为"方法")
    def 进原料(self, 水果):
        self.原料库存.append(水果)
    
    def 榨果汁(self):
        水果 = self.原料库存.pop()
        果汁 = 水果 + "汁"
        self.产品库存.append(果汁)
        return 果汁

# 先建一个工厂(创建对象)
我的工厂 = 饮料工厂()

# 工厂开始工作(调用方法)
我的工厂.进原料("苹果")
苹果汁 = 我的工厂.榨果汁()
print(我的工厂.产品库存)  # 能看到生产记录


python中,class类和def函数有什么区别,用通俗易懂的类比方法来解释  Python基础语法 082445qpdr044nggpqgpft

简单说:函数是 "一次性工具",类是 "带记忆的工作台"。





上一篇:Python的类中,有很多默认的特殊方法,常见特殊方法汇总
下一篇:类名称的括号里可以有多少个参数,这些参数的位置是固定的吗,有没有什么要求或讲究?
回复

使用道具 举报

724

主题

946

帖子

3134

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3134
 楼主| 发表于 前天 08:26 | 显示全部楼层
上面的例子中,self是什么意思

在类的方法中,self 就像工厂里的 "工人",负责指代当前正在工作的 "工厂本身"。
还是用之前的 "饮料工厂" 举例:
当你创建一个工厂(我的工厂 = 饮料工厂()),这个工厂就有自己的原料库存、产品库存。
当你调用 我的工厂.进原料("苹果") 时:
  • self 就代表 "我的工厂" 这个具体的工厂
  • self.原料库存 就是指 "我的工厂的原料库存"
  • 如果再建一个 你的工厂 = 饮料工厂(),那 self 在 你的工厂 里就代表 "你的工厂"

简单说:self 是个 "代词",在类的方法里,它永远指 "当前这个对象本身"。
就像你在说 "我今天上班",这里的 "我" 就相当于 self,指的是说话的这个人自己。

回复

使用道具 举报

724

主题

946

帖子

3134

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3134
 楼主| 发表于 前天 08:32 | 显示全部楼层
在类中,self是必须要有的一个参数吗??

在类的方法中,self 几乎是必须的,但有一个特殊情况例外。

1. 普通方法:必须有 self
就像工厂里的工人必须知道自己在哪个工厂工作一样,类中定义的普通方法(需要操作当前对象的方法)第一个参数必须是 self,用来指代当前对象本身。
例如:
class 饮料工厂:
    def 进原料(self, 水果):  # 必须有self
        self.原料库存.append(水果)  # 通过self操作当前工厂的库存


如果省略 self,调用方法时会报错,因为 Python 会默认把当前对象作为第一个参数传进去,但方法却没有参数接收它。

2. 特殊情况:静态方法可以没有 self
如果某个方法不需要操作对象本身(比如只是一个独立的工具函数,和工厂本身无关),可以用 @staticmethod 装饰成静态方法,这时就不需要 self 了。
例如:
class 饮料工厂:
    @staticmethod  # 静态方法标记
    def 清洗工具():  # 不需要self
        print("清洗榨汁机")  # 这个操作和具体哪个工厂无关

# 调用时甚至可以直接通过类名调用,不用创建对象
饮料工厂.清洗工具()  # 输出:清洗榨汁机


总结:
类中大多数方法(需要操作对象数据的)必须有 self 作为第一个参数。
只有静态方法(用 @staticmethod 标记,不依赖对象本身)可以没有 self。
简单说:需要 "认识" 当前对象的方法,必须带 self;完全独立的工具方法,可以不带 self。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|21番茄网 ( 粤ICP备10099428号 ) 奇远富

GMT+8, 2025-8-8 01:41 , Processed in 2.001758 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表