2025-02-13 python类中init函数

在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__()。

参数匹配:父类构造函数参数不足或类型错误会直接导致实例化失败。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容