init

Python
__init__在class中的含义与作用
Published

September 20, 2025

__init__ 是 Python 类中一个非常特殊且重要的魔术方法(也称为双下方法初始化方法)。


一、__init__ 的核心含义

__init__ 方法的主要作用是初始化一个新创建的对象

当你使用类名创建一个实例时(例如 obj = MyClass()),Python 会自动执行以下步骤:

  1. 调用 __new__ 方法创建一个新的对象实例(这个过程通常不需要手动干预)。
  2. 调用 __init__ 方法,对这个新创建的对象进行初始化,比如设置初始属性值。

因此,__init__ 不是构造函数(真正的构造函数是 __new__),而是初始化方法。它的任务是为对象的属性赋予初始值。


二、基本语法

class ClassName:
    def __init__(self, param1, param2, ...):
        self.attribute1 = param1
        self.attribute2 = param2
        # ... 其他初始化逻辑
  • self:第一个参数,代表当前正在被初始化的对象实例。它必须是第一个参数,但名字不强制叫 self(尽管这是约定俗成的)。
  • 其他参数:用于接收创建对象时传入的参数。

三、详细用法与示例

1. 基本用法:初始化实例属性

class Person:
    def __init__(self, name, age):
        self.name = name  # 将参数值赋给实例属性
        self.age = age
        self.is_adult = age >= 18  # 也可以计算并设置其他属性

# 创建实例,参数会传递给 __init__
person1 = Person("Alice", 25)
person2 = Person("Bob", 16)

print(person1.name)     # 输出: Alice
print(person1.age)      # 输出: 25
print(person1.is_adult) # 输出: True

print(person2.is_adult) # 输出: False

2. 提供默认参数

你可以为 __init__ 的参数设置默认值,这样在创建对象时可以省略这些参数。

class Car:
    def __init__(self, brand, model, color="Black", year=None):
        self.brand = brand
        self.model = model
        self.color = color
        self.year = year or 2025  # 如果没提供年份,默认为2025

car1 = Car("Toyota", "Camry")
print(car1.color)  # 输出: Black (默认值)
print(car1.year)   # 输出: 2025

car2 = Car("Honda", "Civic", "Red", 2023)
print(car2.color)  # 输出: Red

3. 执行复杂的初始化逻辑

__init__ 不仅限于赋值,还可以包含任何初始化逻辑,比如:

  • 验证参数
  • 打开文件或网络连接
  • 计算派生值
  • 调用其他方法
class BankAccount:
    def __init__(self, owner, initial_balance=0):
        self.owner = owner
        
        if initial_balance < 0:
            raise ValueError("Initial balance cannot be negative.")
        
        self.balance = initial_balance
        self.transaction_history = []  # 初始化一个空列表
        self._log_transaction("Account created", initial_balance)

    def _log_transaction(self, action, amount):
        # 记录交易日志
        self.transaction_history.append(f"{action}: ${amount}")

# 使用
try:
    account = BankAccount("Charlie", 1000)
    print(account.balance)  # 输出: 1000
except ValueError as e:
    print(e)

4. __init__ 的返回值

  • __init__ 不应该返回任何值(或者说,它应该返回 None)。
  • 如果你从 __init__ 中返回了非 None 的值,Python 会抛出 TypeError
class BadExample:
    def __init__(self):
        return "I shouldn't return this!"  # 错误!

# obj = BadExample()  # TypeError: __init__() should return None, not 'str'

四、常见误区与注意事项

❌ 误区 1:认为 __init__ 是构造函数

如前所述,__init__初始化方法。对象的创建是由 __new__ 完成的。通常你不需要重写 __new__,除非你在做元类编程或不可变类型定制。

❌ 误区 2:在 __init__ 中创建类属性

class Mistake:
    def __init__(self, value):
        self.shared_list = []  # ✅ 正确:每个实例有自己的列表
        self.shared_list.append(value)  # ❌ 危险!但影响的是实例属性

# 更危险的错误:
class BigMistake:
    def __init__(self, value):
        BigMistake.class_list = []  # ❌ 不要这样做!直接操作类
        BigMistake.class_list.append(value)  # 所有实例共享!

✅ 正确做法:在类定义时创建类属性

class Correct:
    class_list = []  # ✅ 类属性,在所有实例间共享

    def __init__(self, value):
        self.instance_list = []  # ✅ 实例属性,每个实例独立
        self.instance_list.append(value)

❌ 误区 3:忘记 self

class ForgotSelf:
    def __init__(self, name):
        name = name  # ❌ 错误!这只是一个局部变量,不会成为实例属性

✅ 正确:self.name = name


五、__init__ 的高级用法

1. 接收可变参数

class Student:
    def __init__(self, name, *subjects, **grades):
        self.name = name
        self.subjects = list(subjects)  # 元组转列表
        self.grades = grades            # 字典

# 使用
s = Student("Diana", "Math", "Physics", math=95, physics=88)
print(s.subjects)  # ['Math', 'Physics']
print(s.grades)    # {'math': 95, 'physics': 88}

2. 调用父类的 __init__

在继承中,子类通常需要调用父类的 __init__ 来确保父类部分被正确初始化。

class Animal:
    def __init__(self, name, species):
        self.name = name
        self.species = species

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name, "Canis lupus familiaris")  # 调用父类 __init__
        self.breed = breed

dog = Dog("Rex", "Golden Retriever")
print(dog.name)     # Rex
print(dog.species)  # Canis lupus familiaris
print(dog.breed)    # Golden Retriever

六、总结

特性 说明
名称 __init__(前后各有两个下划线)
调用时机 创建对象实例时自动调用
主要作用 初始化对象的实例属性和状态
第一个参数 self(代表当前实例)
返回值 必须为 None
是否必需 不是必需的,但如果需要初始化,则必须定义
__new__ 区别 __new__ 创建对象,__init__ 初始化对象

一句话总结__init__ 是 Python 类的初始化方法,它让你在创建对象的同时,为对象的属性设置初始值,是面向对象编程中定义对象“出生状态”的关键。