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
"""
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值