Python __init__ 方法
最后修改于 2025 年 4 月 8 日
本综合指南探讨了 Python 的 __init__ 方法,该方法是负责对象初始化的特殊方法。我们将介绍基本用法、继承、默认值、多个构造函数和实际示例。
基本定义
__init__ 方法是 Python 类中的一个特殊方法,用于初始化新创建的对象。它在对象被 __new__ 创建后自动调用。
关键特征:它必须接受 self 作为第一个参数,不返回任何内容,并用于设置对象属性的初始值。与其他语言中的构造函数不同,它不创建对象。
基本 __init__ 实现
这是最简单的实现,展示了 __init__ 如何初始化对象属性。 这演示了基本用法模式。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person("Alice", 30)
print(f"{person.name} is {person.age} years old")
此示例创建一个具有 name 和 age 属性的 Person 类。 当创建一个新实例时,__init__ 方法设置这些值。
self 参数指的是正在初始化的实例。属性被赋值给 self 以使其成为实例变量。
默认参数值
__init__ 可以使用默认参数值来使某些参数成为可选参数,同时仍然允许在初始化期间进行自定义。
class Car:
def __init__(self, make, model, year=2023, color="black"):
self.make = make
self.model = model
self.year = year
self.color = color
def __str__(self):
return f"{self.year} {self.make} {self.model} ({self.color})"
car1 = Car("Toyota", "Camry")
car2 = Car("Ford", "Mustang", 2022, "red")
print(car1)
print(car2)
这个 Car 类具有必需的 make 和 model 参数,以及可选的 year 和 color 参数,如果未提供,则默认为 2023 和 "black"。
默认参数使类更灵活,同时减少样板代码。 当大多数实例共享常见的默认值时,它们特别有用。
继承和 __init__
当使用继承时,可以链接 __init__ 方法以正确初始化父类属性以及子类属性。
class Animal:
def __init__(self, species):
self.species = species
def __str__(self):
return f"I am a {self.species}"
class Dog(Animal):
def __init__(self, name, breed):
super().__init__("dog")
self.name = name
self.breed = breed
def __str__(self):
return f"{super().__str__()}, {self.name} the {self.breed}"
dog = Dog("Rex", "Labrador")
print(dog)
此示例显示如何使用 super().__init__() 正确初始化父类属性。 Dog 类扩展了 Animal,同时添加了自己的属性。
super() 函数返回一个代理对象,该对象将方法调用委托给父类。 这确保了正确的方法解析顺序。
使用 @classmethod 的多个构造函数
虽然 Python 不直接支持多个构造函数,但您可以使用 @classmethod 模拟它们以创建替代的初始化方法。
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@classmethod
def from_square(cls, side_length):
return cls(side_length, side_length)
@classmethod
def from_dict(cls, dimensions):
return cls(dimensions['width'], dimensions['height'])
def area(self):
return self.width * self.height
rect1 = Rectangle(4, 5)
rect2 = Rectangle.from_square(3)
rect3 = Rectangle.from_dict({'width': 2, 'height': 7})
print(rect1.area(), rect2.area(), rect3.area())
此 Rectangle 类显示了创建实例的三种方式:通过标准的 __init__,通过正方形工厂方法,以及从维度字典创建。
类方法提供灵活的初始化选项,同时保持一个 __init__ 方法。 每个工厂方法通过调用类构造函数返回一个新实例。
在 __init__ 中初始化集合
当初始化可变集合作为实例属性时,为每个实例创建新集合非常重要,以避免实例之间的共享状态。
class ShoppingCart:
def __init__(self, customer_name):
self.customer_name = customer_name
self.items = [] # New list for each instance
def add_item(self, item):
self.items.append(item)
def __str__(self):
return f"{self.customer_name}'s cart: {', '.join(self.items)}"
cart1 = ShoppingCart("Alice")
cart2 = ShoppingCart("Bob")
cart1.add_item("Book")
cart2.add_item("Shirt")
print(cart1)
print(cart2)
此示例演示了实例特定集合的正确初始化。 每个 ShoppingCart 都会获得其自己的空项目列表。
如果该列表被定义为类变量,则所有实例将共享相同的列表,从而导致在添加项目时出现意外行为。
最佳实践
- 保持 __init__ 简单: 专注于属性初始化
- 避免复杂逻辑: 将业务逻辑移到其他方法
- 使用类型提示: 记录预期的参数类型
- 初始化所有属性: 为可选属性设置默认值
- 调用 super().__init__: 在继承层次结构中
资料来源
作者
列出所有 Python 教程。