page contents

散装Python写到头了,该系统学OOP了

再换一种理解:类是"商品"这个概念,对象是具体的"苹果17"和"华为Mate80"。概念规定了商品有名称、价格、库存,但具体值因商品而异。

attachments-2026-06-3iNXT3gZ6a2a0f6635ae2.png之前在别的公众号看到一段乔布斯对面向对象的比喻,觉得特别精彩。

他说,Object 就像人——活生生的,内部保存着如何做事情的知识,也有记忆。你在一个很高的层次和它交互,不需要关心底层细节。

举个例子:我是你的"负责洗衣的对象",你把脏衣服给我,发一条消息说"请帮我洗衣服",剩下的事不用管。我知道最好的洗衣店在哪,会叫出租车、付钱、取衣服,回来把干净衣服交给你。你不知道我怎么做到的,洗衣房在哪、怎么叫车、怎么付费——所有复杂性都藏在我内部,我们只在高层交流。

这就是对象:封装复杂性,对外提供简单接口。

回头看散装写法——变量满天飞、函数参数越传越多、数据结构谁都能改。小脚本还能凑合,项目一大就乱:改一个字段,不知道影响多少地方;加一个功能,代码越缠越紧。

类能解决这些问题:数据和操作绑在一起,边界清晰;内部细节藏起来,外部只管调用;扩展新功能,不用动老代码。这不是炫技,是代码量上来后的必然选择——散装写到头了,得换个写法才能继续往前走。

那具体怎么创建对象、怎么给它加属性?这篇文章会讲这四件事:

类:图纸,定义"有什么"和"能做什么"

对象:按图纸造出来的具体实例

__init__:初始化方法,创建对象时自动调用

self:对象自己,方法通过它访问自身数据

具体讲解

类是模板,对象是实例

类像图纸,对象是按图纸盖的房子。一张图纸可以盖很多房子,每个房子可以有自己的装修(属性值不同),但结构是一样的。

再换一种理解:类是"商品"这个概念,对象是具体的"苹果17"和"华为Mate80"。概念规定了商品有名称、价格、库存,但具体值因商品而异。

class Product:          # 这是类(图纸)
    pass

p1 = Product()          # 这是对象(房子)
p2 = Product()          # 另一个对象

print(p1 is p2)         # False,两个独立的对象

类定义了"有什么"(属性)和"能做什么"(方法),对象是具体的存在,占用内存空间。

同一个类创建的所有对象,结构相同,但数据独立。改 p1 的库存,不会影响 p2。

给对象添加属性

对象创建后,可以动态添加属性:

class Product:
    pass

p = Product()
p.name = "苹果17"
p.price = 5999
p.stock = 10

print(p.name)   # 苹果17
print(p.price)  # 5999

但这样写太散,每个对象都要手动赋值,容易漏。更好的方式是用 __init__ 方法。

__init__:初始化属性

__init__ 是 Python 的特殊方法,在创建对象时自动调用,用来初始化属性:

class Product:
    def __init__(self, name, price, stock):
        self.name = name
        self.price = price
        self.stock = stock

p1 = Product("苹果17", 5999, 10)
p2 = Product("华为Mate80", 4999, 20)

print(p1.name)   # 苹果17
print(p2.price)  # 4999

self 指的是对象自己。self.name = name 意思是"把这个对象的 name 属性设为传入的 name 参数"。

创建 Product("苹果17", 5999, 10) 时,Python 自动调用 __init__,把 p1 作为 self 传进去。

方法:对象的行为

方法就是定义在类里的函数,第一个参数是 self:

class Product:
    def __init__(self, name, price, stock):
        self.name = name
        self.price = price
        self.stock = stock

    def show_info(self):
        return f"{self.name},价格{self.price}元,库存{self.stock}件"

    def sell(self, quantity):
        self.stock -= quantity
        return f"卖出{quantity}件,剩余{self.stock}件"

    def restock(self, quantity):
        self.stock += quantity

p = Product("苹果17", 5999, 10)
print(p.show_info())  # 苹果17,价格5999元,库存10件
print(p.sell(3))      # 卖出3件,剩余7件
p.restock(5)         # 增加库存
print(p.stock)        # 12

调用 p.sell(3) 时,Python 自动把 p 作为 self 传进去。你不用显式写 p.sell(p, 3)。

这就是方法和普通函数的区别:方法绑定在对象上,调用时自动接收对象本身作为第一个参数。

换个角度看,方法其实就是绑定在对象上的函数。你也可以手动传 self,效果一样:

p = Product("苹果17", 5999, 10)
Product.sell(p, 3)  # 等同于 p.sell(3)

但没人这么写,知道就好。

什么时候用类

不是所有代码都要写成类。

写个 CSV 转换脚本、处理一个配置文件、跑一次数据清洗——这种一次性脚本,直接写函数最直接。数据传进去,结果吐出来,干净利落。硬上 OOP,反而绕。

类适合的场景是:数据和行为绑在一起,多处复用,需要封装内部细节。比如一个库存管理系统,商品有价格、库存、折扣逻辑,还要支持进货、出货、预警——这时候用类,数据和操作绑在一起,边界清晰,扩展方便。

简单说:脚本用函数,系统用类。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

 

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2119 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2228 文章
  3. Pack 2119 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章