__init__是实例化时自动调用的初始化方法,负责设置实例属性、校验参数等;它不创建对象,首个参数必为self,无返回值;支持默认参数、args、*kwargs;应在其中做类型和取值校验,避免耗时操作;self.xxx赋值生成实例属性,类内直接定义为类属性。

Python中类的__init__方法是实例化对象时自动调用的初始化函数,它不负责创建对象(那是__new__的工作),而是负责为新创建的对象设置初始状态——比如赋值属性、打开资源、校验参数等。
__init__方法的基本写法和作用
__init__是一个特殊方法(也叫“魔术方法”),必须命名为__init__,且第一个参数固定为self,代表当前正在初始化的实例。它没有返回值(即隐式返回None),如果手动写return语句,也不能返回非None值,否则会报错。
常见写法示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
创建实例时自动触发:
立即学习“Python免费学习笔记(深入)”;
p = Person("小明", 25) # 此时 __init__ 被调用,self 指向 p
带默认参数和可选参数的__init__
和普通函数一样,__init__支持默认参数、*args、**kwargs,适合处理灵活的初始化需求。
- 使用默认值让某些参数可选
- 用
**kwargs接收额外配置项,再分发给属性或子组件 - 用
*args接收不定长位置参数(较少见,需谨慎设计)
示例:
class DatabaseConnection:
def __init__(self, host, port=5432, database="default", **options):
self.host = host
self.port = port
self.database = database
self.timeout = options.get("timeout", 30)
self.ssl = options.get("ssl", False)
调用方式多样:
十天学会易语言图解教程用图解的方式对易语言的使用方法和操作技巧作了生动、系统的讲解。需要的朋友们可以下载看看吧!全书分十章,分十天讲完。 第一章是介绍易语言的安装,以及运行后的界面。同时介绍一个非常简单的小程序,以帮助用户入门学习。最后介绍编程的输入方法,以及一些初学者会遇到的常见问题。第二章将接触一些具体的问题,如怎样编写一个1+2等于几的程序,并了解变量的概念,变量的有效范围,数据类型等知识。其后,您将跟着本书,编写一个自己的MP3播放器,认识窗口、按钮、编辑框三个常用组件。以认识命令及事件子程序。第
db1 = DatabaseConnection("localhost")
db2 = DatabaseConnection("192.168.1.100", port=5433, timeout=60, ssl=True)
在__init__中做参数校验和异常处理
初始化阶段是检查输入合法性的好时机。若参数不符合预期,应主动抛出ValueError、TypeError等内置异常,避免后续运行时报更难排查的错误。
典型做法:
- 检查类型:
if not isinstance(age, int): raise TypeError(...) - 检查取值范围:
if age 150: raise ValueError(...) - 检查必填项是否为空:
if not name.strip(): raise ValueError("name cannot be empty")
注意:不要在__init__里做耗时操作(如网络请求、大文件读取),除非明确需要且可控;这类逻辑更适合放在单独的方法中按需调用。
__init__与类属性、实例属性的区别
初学者容易混淆类属性和实例属性。关键点在于:所有在__init__中通过self.xxx = ...定义的,都是实例属性;而直接在类体中定义的变量(不在任何方法内)是类属性,被所有实例共享。
错误示范(意外共享):
class BadCounter:
items = [] # 类属性!所有实例共用同一个列表
def __init__(self, name):
self.name = name
self.items.append(name) # 每次都往同一个列表加
正确写法(每个实例独立):
class GoodCounter:
def __init__(self, name):
self.name = name
self.items = [] # 实例属性,在 __init__ 中创建
self.items.append(name)
判断依据很简单:看赋值语句是否出现在self.之后,且是否在__init__(或其他实例方法)内部执行。









