Python3中的super()用法

1. 单继承

使用super()函数在子类的init方法中对父类的init方法进行了调用,使得子类不仅可以使用父类的方法,还可以使用在父类的init方法中声明的属性

1.1. 调用父类的方法和属性

  • without super()
class A:
    def __init__(self):
        self.x="A类(父类)中的属性"
    def func_A(self):
        print("A类(父类)中的方法")
        print(self.x)

class B(A):
    def __init__(self):
        print("B类中的属性")
        #super(B,self).__init__()
    def func_B(self):
        print("B类中原始的方法")

res = B()
res.func_A() #调用父类的方法
res.x		 #调用父类的属性


"""输出
B类中的属性
A类(父类)中的方法
AttributeError: 'B' object has no attribute 'x'
"""

可以看到没有用super时,调用属性会直接报错

  • 重写父类的方法
class A:
    def __init__(self):
        self.x="A类(父类)中的属性"
    def func_A(self):
        print("A类(父类)中的方法")

class B(A):
    def __init__(self):
        print("B类中的属性")
        #super(B,self).__init__()
    def func_B(self):
        print("B类中原始的方法")
    def func_A(self):
        print("重写A类(父类)中func_A的方法")
        
res = B()
res.func_A() #调用重写后的父类方法
res.x        #调用父类的属性

"""输出
B类中的属性
重写A类(父类)中func_A的方法
AttributeError: 'B' object has no attribute 'x'
"""

可以看到不是用super,只能调用父类的方法,不能够调用属性

1.2. 调用方法和属性

  • with super()
class A:
    def __init__(self):
        self.x="A类(父类)中的属性"
    def func_A(self):
        print("A类(父类)中的方法")
        print(self.x)

class B(A):
    def __init__(self):
        print("B类中的属性")
        super(B,self).__init__()	#继承父类的属性
    def func_B(self):
        print("B类中原始的方法")
               
res = B()
res.func_A()
res.x

"""输出
B类中的属性
A类(父类)中的方法
A类(父类)中的属性
'A类(父类)中的属性'
"""

可以看到在加入super()后,可以正常的调用父类的所有属性

  • 方法重写后使用super()调用父类的方法
class A:
    def __init__(self):
        self.x="A类(父类)中的属性"
    def func_A(self):
        print("A类(父类)中的方法")

class B(A):
    def __init__(self):
        print("B类中的属性")
        super(B,self).__init__() #继承父类的属性
    def func_B(self):
        print("B类中原始的方法")
    def func_A(self):
        print("重写A类(父类)中func_A的方法")
        super(B,self).func_A()   #继承父类的方法
        
res = B()
res.func_A() #调用重写后的父类方法
res.x        #调用父类的属性

"""输出
B类中的属性
重写A类(父类)中func_A的方法
A类(父类)中的方法
'A类(父类)中的属性'
"""

2. 多继承

super与父类没有实质性的关联。在单继承时,super获取的类刚好是父类,但多继承时,super获取的是继承顺序中的下一个类。以下面的继承方式为例:

   A
  /  \
 /    \
B      C
 \    /
  \  /
   D
class A(object):
    def __init__(self):
        print("enter A")
        print("leave A")

class B(A):
    def __init__(self):
        print("enter B")
        super(B, self).__init__()
        print("leave B")

class C(A):
    def __init__(self):
        print("enter C")
        super(C, self).__init__()
        print("leave C")

class D(B, C):
    def __init__(self):
        print("enter D")
        super(D, self).__init__()
        print("leave D")

D() 			#多重继承
print(D.mro())  #查看继承结构

# 测试结果
"""
enter D
enter B
enter C
enter A
leave A
leave C
leave B
leave D
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
"""

3. 总结

  1. 使用super()进行父类方法和属性的调用是个好习惯
  2. 当使用super()时,建议误将父类的方法进行重写,否则该方法会被调用两次(父类和重写后的方法分别被调用)
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Python ,`super()` 函数可以用于调用父类的方法。可以通过 `super()` 函数来调用父类的方法,而不需要明确指定父类的名称。 在 Python 3 ,`super()` 函数的使用方法如下: ```python class ChildClass(ParentClass): def some_method(self, arg): super().some_method(arg) # 继续执行子类的代码 ``` 在上述示例,`ChildClass` 继承自 `ParentClass`,并且重写了 `some_method` 方法。在子类的 `some_method` 方法,`super().some_method(arg)` 调用了父类的 `some_method` 方法,而后面的代码则继续执行子类的代码。 注意:`super()` 函数只能用于调用父类的实例方法,不能用于调用父类的类方法或静态方法。此外,如果子类和父类都有同名的方法,那么 `super()` 函数会优先调用父类的方法。 ### 回答2: 在Pythonsuper是一个内建函数,用于调用父类的方法。 super函数通常在子类的方法使用,当子类需要调用父类的方法时,可以使用super()函数来实现。这样可以避免直接使用父类的名称,使代码更加灵活和可维护。 super()函数通常在子类的方法作为第一个参数使用,例如super().__init__()。通过super()函数调用父类的方法时,会传递当前子类的实例作为参数自动传递给父类方法,从而使得父类的方法能够正确操作子类的实例。 使用super()函数的好处是,当父类发生变化时,子类无需修改调用父类方法的代码,因为super()函数会动态查找父类,保证调用的是正确的父类方法。这样可以减少重复、冗余的代码,提高代码的可维护性和扩展性。 尤其是在多重继承的情况下,使用super()函数可以更方便地调用父类的方法。super()函数按照方法解析顺序(MRO)自动查找父类,确保每个父类的方法只被调用一次。 总之,super()函数在Python的作用是用于调用父类的方法,并且在子类更方便、易维护地调用。 ### 回答3: 在Pythonsuper()是一个内置函数,用于调用父类的方法。它通常在子类的方法被调用,以便子类可以继承并扩展父类的功能。super()函数以两个参数呈现: 第一个参数是表示当前子类的类名,通常是使用super()的类的名称。 第二个参数是一个对象,用于指定一个对象,这个对象是当前子类的实例。如果不提供第二个参数,则默认会获取当前子类的实例。 通过使用super()函数,子类可以调用父类具有相同名称的方法,并且可以在子类的方法添加额外的逻辑。 使用super()的常见情况是在子类的__init__()方法。在子类,如果想要保留父类的一些初始化逻辑,可以通过调用super().__init__()来实现。这样子类在初始化时可以继承并执行父类的初始化步骤,然后再添加自己的初始化逻辑。 除了在__init__()方法使用外,super()也可以在任何子类方法使用,以便调用父类的方法。这种方法可以让子类继承父类的行为,并且可以在子类做一些额外的操作。 需要注意的是,在使用super()时,当一个类有多个父类时,super()只能调用其一个父类的方法。从技术上来说,super().__init__()只会调用父类的下一个方法。为了调用所有父类的方法,可以使用类名来调用相应的父类方法。 总结来说,super()函数在Python用于调用父类的方法。它通过简化子类的代码,使子类能够继承并扩展父类的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值