python super() init()函数的作用

部署运行你感兴趣的模型镜像

介绍

写pytorch的时候总是遇到A(B)的情形,下面主要介绍一下python中super和init的区别。参考其他博主的内容!

super()用来调用父类(基类)的方法,init()是类的构造方法。
super().init()就是调用父类的init方法, 同样可以使用super()去调用父类的其他方法。

1、分别理解super()和 __ init __()

1.1、super()

情况一:B和A无同名方法
# B和A无同名方法
class A:
    def hi(self):
        print("A hi")


class B(A):
    def hello(self):
        # B调用自己的hi,但是自己没有hi函数,此时就调用A的hi()
        self.hi()
        # 直接调用父类A的hi()函数
        super().hi()


b = B()
print("b.hi():")
b.hi()  # b没有hi,但是继承了A,就调了A的hi函数
print("-------------")
print("b.hello():")
b.hello()

"""
结果如下:
b.hi():
A hi
-------------
b.hello():
A hi
A hi
"""
情况二:B和A有同名方法
# B和A有同名方法
class A:
    def hi(self):
        print("A的hi")


class B(A):
    # 与父类A中的hi同名
    def hi(self):
        print("B的hi")

    def hello(self):
        # 调用B自己的hi函数
        self.hi()
        # 调用父类A的hi函数
        super().hi()


b = B()
print("b.hi():")
b.hi()
print("-------------")
print("b.hello():")
b.hello()
"""
运行结果
b.hi():
B的hi
-------------
b.hello():
B的hi
A的hi
"""

1.2、init()

init() 是python中的构造函数,在创建对象的时"自动调用"。

# __init__() 是python中的构造函数,在创建对象的时"自动调用"。
class A:
    def __init__(self):
        print("A此时被创建了!")


a = A()
"""
运行结果:
A此时被创建了!
"""

# 注意:
# 定义类时可以不写init方法,系统会默认创建,
# 你也可以写一个,让你的类在创建时完成一些“动作”。

定义类时可以不写init方法,系统会默认创建, 你也可以写一个,让你的类在创建时完成一些“动作”。

1.3、super(). __ init __()

如果子类B和父类A,都写了init方法, 那么A的init方法就会被B覆盖。
想调用A的init方法需要用super去调用。

情况一:B覆盖了父类A的init
# B覆盖了父类A的init
class A:
    def __init__(self):
        print("A的init被调用了!")


class B(A):
    def __init__(self):
        print("B的init被调用了!")


b = B()
"""
运行结果:
B的init被调用了!
"""
情况二:B覆盖了父类A的init,B通过super又调用了A的init
# B覆盖了父类A的init
# B通过super又调用了A的init
class A:
    def __init__(self):
        print("A的init被调用了!")


class B(A):
    def __init__(self):
        super().__init__()
        print("B的init被调用了!")


b = B()
"""
运行结果:
A的init被调用了!
B的init被调用了!
"""

当然,在B内部,除了用super调用父类的方法,也可以用父类名调用,例:

# 用父类名调用
class A:
    def __init__(self):
        print("A的init被调用了!")


class B(A):
    def __init__(self):
        A.__init__(self)
        print("B init")


b = B()
"""
运行结果:
A的init被调用了!
B init
"""

1.3.1、关于覆盖的疑问

问:有人可能会误解“覆盖”的意思,认为“覆盖”了就是没有,为什么还能通过super调用?
答:覆盖了并不是没有了,A的方法终都还在,但需要在B内部用super调用。
例:
A里写了一个方法hi(), B继承自A, B里也写了一个方法hi()。
B的对象在外部调用hi(), 就只能调用B里面写的这个hi()。
想通过B调用A的hi(),只能在B内部用super().hi()调用。

class A:
    def hi(self):
        print("A hi")


class B(A):
    def hello(self):
        print("B hello")


b = B()
# B里没有写hi(),这里调用的是继承自A的hi()
b.hi()
"""
运行结果:
A hi
"""
class A:
    def hi(self):
        print("A hi")


class B(A):
    def hi(self):
        print("B hi")


b = B()
# 这里调用的就是B自己的hi()
b.hi()
"""
运行结果:
B hi
"""
class A:
    def hi(self):
        print("A hi")


class B(A):
    def hi(self):
        # 通过super调用父类A的hi()
        super().hi()
        print("B hi")


b = B()
# 这里调用的就是B里面的hi()
b.hi()
"""
运行结果:
A hi
B hi
"""

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

Python 中,`__init__` 函数是一个特殊的方法,也被称为构造函数。它在创建类的实例时自动调用,用于初始化对象的属性。 ### `__init__` 函数的基本使用 当定义一个类的实例时,`__init__` 函数会自动执行,将类的参数赋给实例对象。例如,定义一个 `GirlFriend` 类并创建实例: ```python class GirlFriend: def __init__(self, name, age, height, weight, cup): self.name = name self.age = age self.height = height self.weight = weight self.cup = cup myGirlFriend = GirlFriend("xxx", 20, 170, 50, 'C') ``` 在上述代码中,定义实例化对象 `myGirlFriend` 后,它会自动调用 `__init__` 函数,将传入的参数赋给 `myGirlFriend` 的各个属性[^4]。 ### 在继承关系中使用 `__init__` 和 `super().__init__()` 在继承的上下文中,`__init__` 在每个类中都可以独立定义,而 `super().__init__()` 则用于确保父类的初始化逻辑被执行。例如在 PyTorch 自定义神经网络模型中: ```python import torch.nn as nn class MyModel(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(MyModel, self).__init__() # 调用 nn.Module 的 __init__ 方法 self.fc1 = nn.Linear(input_size, hidden_size) self.fc2 = nn.Linear(hidden_size, output_size) def forward(self, x): x = self.fc1(x) x = self.fc2(x) return x ``` 这里 `MyModel` 类继承自 `nn.Module`,在 `__init__` 方法中使用 `super().__init__()` 调用了父类 `nn.Module` 的 `__init__` 方法,以确保父类的初始化逻辑被执行[^3]。 另外,在多继承的情况下,`super().__init__()` 的执行对象是 MRO(方法解析顺序)顺序的下一个类。例如在类 `B` 的 `__init__` 方法中执行 `super().__init__()`,它会执行 MRO 顺序下一个类(如 `A1`)的 `__init__` 方法[^2]。 ### 在模块初始化中的使用 在 Python 包的 `__init__.py` 文件中也可以使用类似的初始化逻辑。例如在 `subproject` 目录中的 `__init__.py` 文件里加入代码: ```python name = '__init__.py' print('subproject->', name) ``` 当在项目中导入 `subproject` 包时,这段代码会执行相应的初始化操作[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值