关注我,学习更多实用Python知识
🌼Hi,小伙伴们~
🛠️Python中__init__就像一个多面手——既能为类的新对象开启初始化之门,也能作为包的入口
🎯今天,整理分享Python中名字奇怪,但特别重要的角色——__init__

__init__:可以是类的方法也可以是包的模块文件,读作"dunder init"(double underscore init)出现频率很高,主要用在以下2个场景:
class MyClass: def __init__(self): # 对象构造器 self.data = "hello"mypackage/ __init__.py # 包初始化文件 module.pyclass User: def __init__(self, name, age): self.name = name # 初始化实例属性 self.age = age # 每个实例有自己的数据# 创建实例(自动调用__init__)user1 = User("张三丰", 105) # 关键点:这里自动执行__init__名字固定:必须是 __init__(两边各两个下划线)
自动执行:创建对象时,Python 自己会调用它
self 参数:第一个参数写成 self,代表这个对象自己
非强制但推荐:虽可省略,从专业角度推进使用
当目录中包含__init__.py文件,Python就将其识别为包而非普通文件夹,__init__.py有4大基本功能
mypackage/ # 包目录 __init__.py # 包初始化文件(必需) module1.py # 模块文件 module2.py哪怕 init.py 是个空文件,Python 也知道这个文件夹是一个包,可以这样导入:
# 空文件即可,表明这是一个Python包# 允许:import mypackage你可以在 init.py 里预先导入模块里的内容:
from .module1 import some_functionfrom .module2 import SomeClass这样别人用你的包时就可以直接:
import mypackagemypackage.some_function() # 不用写长长的路径比如版本号、作者,或者一些初始化操作:
# 包级配置和常量__version__ = "1.0.0"__author__ = "开发团队"# 包初始化代码print(f"初始化包 v{__version__}")用 all 来声明别人可以通过 from mypackage import * 导入哪些东西:
__all__ = ['public_func', 'PublicClass']# 只暴露想暴露的内容from .public import public_func, PublicClass__init__ | __init__.py | |
|---|---|---|
obj = MyClass()时 | import package 时 | |
简单来说,掌握这两种__init__,就掌握了Python面向对象与模块化编程的两把钥匙
你可能一直以为__init__是创建对象的构造函数,但真相是:真正的构造函数是__new__! __init__只是初始化方法
# 真相:真正的构造函数是__new__class Demo: def __new__(cls, *args, **kwargs):print("这才是真正的构造方法")return super().__new__(cls) def __init__(self):print("我只是初始化方法,__new__后才执行")# 测试d = Demo() # 先输出"这才是...",再输出"我只是..."你以为子类会自动调用父类的__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: 父类属性未初始化!你可能觉得__init__就是个普通方法,但它有个特殊限制:绝对不能返回任何值(除了None)尝试返回其他内容会直接导致运行时错误:
class User: def __init__(self, name): self.name = namereturn"创建成功"# 千万不要这样做!# 实例化时会直接报错u = User("小明") # TypeError: __init__() should return None类的__init__是对象的"出生证明",赋予每个实例独特的身份和初始状态
包的__init__.py像是代码库的"外交官",管理着对外的所有接口和交互
✅ 写出更健壮、易用的类
✅ 设计结构清晰、便于引用的包
✅ 搭建更易于维护的 Python 项目结构
⭐ 关注我,持续分享 Python 干货和小工具~
📌 如果这篇文章对你有帮助,欢迎:
💬 点赞、收藏、分享给更多学Python的小伙伴~


👇点击阅读往期文章