Python类初始化教程_init方法使用详解

__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

创建实例时自动触发:

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)

调用方式多样:

db1 = DatabaseConnection("localhost")
db2 = DatabaseConnection("192.168.1.100", port=5433, timeout=60, ssl=True)

在__init__中做参数校验和异常处理

初始化阶段是检查输入合法性的好时机。若参数不符合预期,应主动抛出ValueErrorTypeError等内置异常,避免后续运行时报更难排查的错误。

典型做法:

  • 检查类型: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__(或其他实例方法)内部执行。