当前位置:首页>python>学了这么久Python,你真的懂__init__吗?

学了这么久Python,你真的懂__init__吗?

  • 2026-10-26 08:23:39
学了这么久Python,你真的懂__init__吗?

关注我,学习更多实用Python知识

🌼Hi,小伙伴们~

🛠️Python中__init__就像一个多面手——既能为类的新对象开启初始化之门,也能作为包的入口

🎯今天,整理分享Python中名字奇怪,但特别重要的角色——__init__

🎯 出现__init__两个重要场景

先认识一下__init__

__init__:可以是类的方法也可以是包的模块文件,读作"dunder init"(double underscore init)出现频率很高,主要用在以下2个场景:

场景1:类初始化 ✅

class MyClass:    def __init__(self):  # 对象构造器        self.data = "hello"

场景2:包初始化 ✅

mypackage/    __init__.py  # 包初始化文件    module.py

📦 场景一:类的__init__方法

🎨 基础用法

class User:    def __init__(self, name, age):        self.name = name  #  初始化实例属性        self.age = age    #  每个实例有自己的数据# 创建实例(自动调用__init__)user1 = User("张三丰", 105)  #  关键点:这里自动执行__init__

✨ 几个需要记住的小特点:

名字固定:必须是 __init__(两边各两个下划线)

自动执行:创建对象时,Python 自己会调用它

self 参数:第一个参数写成 self,代表这个对象自己

非强制但推荐:虽可省略,从专业角度推进使用

📁 场景二:包的__init__.py文件

包的灵魂文件

当目录中包含__init__.py文件,Python就将其识别为包而非普通文件夹,__init__.py有4大基本功能

mypackage/           # 包目录    __init__.py     #  包初始化文件(必需)    module1.py      # 模块文件    module2.py

📍1.  标识这是一个包

哪怕 init.py 是个空文件,Python 也知道这个文件夹是一个包,可以这样导入:

# 空文件即可,表明这是一个Python包# 允许:import mypackage

📦2.  管理导入,让调用更简单

你可以在 init.py 里预先导入模块里的内容:

from .module1 import some_functionfrom .module2 import SomeClass

这样别人用你的包时就可以直接:

import mypackagemypackage.some_function()  # 不用写长长的路径

⚙️3.  存放包的基本信息和配置

比如版本号、作者,或者一些初始化操作:

# 包级配置和常量__version__ = "1.0.0"__author__ = "开发团队"# 包初始化代码print(f"初始化包 v{__version__}")

🚪4.  控制哪些内容对外可见

用 all 来声明别人可以通过 from mypackage import * 导入哪些东西:

__all__ = ['public_func', 'PublicClass']# 只暴露想暴露的内容from .public import public_func, PublicClass

🔍 两种__init__的对比

特点
类的 __init__
包的 __init__.py
在哪里
类内部
包的根目录里
作用
初始化一个对象
标识并初始化一个包
执行时机
obj = MyClass()时import package 时
主要功能
设置这个对象的属性
1. 告诉Python这是包2. 统一导入入口3. 存放包的信息
能否省略
可以(但强烈建议写)
Python 3.3 之前:必须Python 3.3 之后:可不写(但建议保留)

简单来说,掌握这两种__init__,就掌握了Python面向对象与模块化编程的两把钥匙

🔥 "冷知识"内容:

1. __init__不是构造函数!

你可能一直以为__init__是创建对象的构造函数,但真相是:真正的构造函数是__new__! __init__只是初始化方法

# 真相:真正的构造函数是__new__class Demo:    def __new__(cls, *args, **kwargs):print("这才是真正的构造方法")return super().__new__(cls)    def __init__(self):print("我只是初始化方法,__new__后才执行")# 测试d = Demo()  # 先输出"这才是...",再输出"我只是..."

2. __init__的继承容易“踩坑”!

你以为子类会自动调用父类的__init__?并不是!如果子类定义了__init__,必须手动调用super().init(),否则父类的初始化会被完全跳过:

class Parent:    def __init__(self):        self.base = "父类属性"# 这行不会执行!class Child(Parent):    def __init__(self):        self.child = "子类属性"# 忘记调用super().__init__()是常见错误c = Child()print(c.child)  #  正常print(c.base)   #  AttributeError: 父类属性未初始化!

3. __init__不能有返回值(除了None)!

你可能觉得__init__就是个普通方法,但它有个特殊限制:绝对不能返回任何值(除了None)尝试返回其他内容会直接导致运行时错误:

class User:    def __init__(self, name):        self.name = namereturn"创建成功"# 千万不要这样做!# 实例化时会直接报错u = User("小明")  # TypeError: __init__() should return None

📚 概括总结

类的__init__是对象的"出生证明",赋予每个实例独特的身份和初始状态

包的__init__.py像是代码库的"外交官",管理着对外的所有接口和交互

掌握这两种__init__的使用,你就能:

✅ 写出更健壮、易用的类

✅ 设计结构清晰、便于引用的包

✅ 搭建更易于维护的 Python 项目结构

💎关 注

⭐ 关注我,持续分享 Python 干货和小工具~

📌 如果这篇文章对你有帮助,欢迎:

💬 点赞、收藏、分享给更多学Python的小伙伴~

👇点击阅读往期文章

1.除了PyInstaller,打造专业安装包你还需要这个秘密武器
2.要用 Python 爬虫,这些基础知识你一定要懂!
3.手把手教你 “ 爬取小红书评论内容 ”,0基础也能上手的 Python 爬虫实战!
4.告别手敲界面!用Qt Designer"拖拉拽"搞定Python GUI
5.超7000万次下载!Python自动化神器PyAutoGUI,助你轻松准时下班!
6.告别命令行,可视化的打包" 神器 "!轻松让 Python 程序转 EXE
7.用3分钟学会 Python 自动发邮件,定时推送+各种附件一劳永逸!
8.企业微信自动发送图文、文件、音视频 Python 实现指南
9.Pandas +Excel:数据筛选、VLOOKUP、透视、公式、绘图 一个案例全搞定
10.Python 生成二维码:自定义背景、Logo 与样式,批量生成超实用案例!
11.用Python玩转PDF:文字提取/图片抓取/转PPT技巧(附完整代码)
12.Python抓取摄像头图像,进行AI识别(四):AI火焰自动预警的实现

最新文章

随机文章