在Python中,__init__ 是类的构造函数,用于初始化实例的属性。以下是关键点总结:
1.基本语法
class MyClass:
def __init__(self, 参数1, 参数2):
self.属性1 = 参数1
self.属性2 = 参数2
self 是实例本身的引用,必须作为第一个参数。在创建对象时自动调用,无需手动调用。
2.参数传递与默认值
必需参数:若未提供会报错。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
实例化:p = Person("Alice", 30)
默认参数:可设置参数的默认值。
class Person:
def __init__(self, name, age=0):
self.name = name
self.age = age
实例化:p = Person("Bob")(age 默认为0)
3.功能扩展
参数验证:可在 __init__ 中添加逻辑
class Person:
def __init__(self, name, age):
if age < 0:
raise ValueError("年龄不能为负数")
self.name = name
self.age = age
调用其他方法:初始化时执行额外操作
class MyClass:
def __init__(self, value):
self.value = value
self.setup()
def setup(self):
print("初始化完成")
继承与父类初始化
使用 super() 调用父类的 __init__:
class Parent:
def __init__(self, x):
self.x = x
class Child(Parent):
def __init__(self, x, y):
super().__init__(x) # 调用父类初始化
self.y = y
注意事项
(1)返回值:__init__ 必须返回 None,否则会引发错误。
(2)默认构造函数:若未定义 __init__,Python 使用默认的空构造函数。
在Python中,如果类没有显式定义__init__方法,则会自动使用一个默认的空构造函数。这个默认构造函数不执行任何初始化操作,允许无参数实例化。对象属性可以在实例化后动态添加。
class Person:
pass # 没有定义 __init__,使用默认构造函数
# 实例化时不带参数(默认构造函数生效)
p = Person()
# 动态添加属性
p.name = "Alice"
p.age = 30
print(p.name, p.age) # 输出: Alice 30
(3)继承行为:子类若无 __init__,自动调用父类的 __init__(需参数匹配)。
001.子类无__init__,自动调用父类构造函数
若子类未定义__init__,实例化时会直接调用父类的__init__,且参数需与父类构造函数完全匹配)
class Father:
def __init__(self, name):
self.name = name
print("父类构造函数被调用")
class Son(Father): # 子类无 __init__
pass
# 实例化子类时需传递父类 __init__ 的参数
son = Son("Alice") # 输出: 父类构造函数被调用
print(son.name) # 输出: Alice
否则会报错:
son = Son() # 报错: TypeError: __init__() missing 1 required positional argument: 'name'
002. 子类定义__init__但不调用父类构造函数
若子类重写__init__且未显式调用父类构造函数,父类的__init__不会执行,可能导致父类属性未初始化
class Father:
def __init__(self, name):
self.name = name
class Son(Father):
def __init__(self, age): # 子类重写 __init__
self.age = age
son = Son(30)
print(son.age) # 输出: 30
print(son.name) # 报错: AttributeError: 'Son' object has no attribute 'name'
003.显式调用父类构造函数
若子类重写__init__,需通过super()或父类名显式调用父类构造函数以继承初始化逻辑
class Father:
def __init__(self, name):
self.name = name
class Son(Father):
def __init__(self, name, age):
super().__init__(name) # 使用 super 调用父类 __init__
self.age = age
son = Son("Bob", 25)
print(son.name, son.age) # 输出: Bob 25
自动调用条件:子类无__init__ → 父类构造函数自动执行,参数需匹配
手动调用场景:子类有__init__ → 需显式调用super().__init__()。
参数匹配:父类构造函数参数不足或类型错误会直接导致实例化失败。