super()方法

super的作用。
super出现在继承了父类的子类中。有三种存在方式:
第一种
super.xxx;(xxx为变量名或对象名)
这种方法意义为,获取父类中的名字为xxx的变量或方法引用。
使用这种方法可以直接访问父类中的变量或对象,进行修改赋值等操作
第二种
super.xxx();(xxx为方法名)
这种方法意义为,直接访问并调用父类中的方法。
第三种
super();
这种方法意义为,调用父类的初始化方法,其实就是调用父类中的public xxx()方法

关于第三种方式是否可以省略不写?
答:
看情况,比如说,你自己从新封装了jdk里面的HashMap类
public class MyMap extends HashMap
这时候,如果你想在实际应用中使用自己的类代替系统中原有的HashMap,就需要写如下代码
public MyMap(){
super();
}
这样,你自己写的类 MyMap map = new MyMap();才能使用
这样做的好处是,你可以不知道原来父类的初始化构造函数是怎么写的。
但是却可以轻易封装它。



                
### Python `super()` 方法使用教程 #### 单继承中的 `super()` 在单继承场景下,`super()` 主要用于调用父类的方法。对于 Python 3.x 版本而言,可以直接利用 `super().method_name` 形式来替代早前版本中所需的 `super(CurrentClass, self).method_name` 表达方式[^1]。 下面是一个简单的例子展示如何在一个子类中重写父类的方法并借助 `super()` 来执行父类原有的实现: ```python class Animal: def speak(self): return "Some sound" class Dog(Animal): def speak(self): original_sound = super().speak() return f"Bark! {original_sound}" dog_instance = Dog() print(dog_instance.speak()) ``` 这段代码会先输出来自 `Dog` 类定义的声音 `"Bark!"` ,接着通过 `super()` 获取到未被覆盖的 `speak` 方法返回值 `"Some sound"` 并将其组合起来作为最终的结果。 #### 多继承与 MRO (Method Resolution Order) 当涉及到多继承时,理解方法解析顺序(MRO)变得至关重要。Python 中至少存在三种不同类型的 MRO 计算机制;然而,在现代 Python(即 Python 3)里唯一支持的是 C3 线性化算法[^2]。此算法确保了即使是在复杂的多重继承结构中也能保持一致性和可预测性的行为模式。 考虑如下一个多继承的例子: ```python class A: def method(self): print("A.method") class B(A): pass class C(A): def method(self): print("C.method") super().method() class D(B, C): pass d_instance = D() d_instance.method() ``` 在这个案例中,由于采用了 C3 线性化原则,所以当我们创建 `D` 的实例并调用其 `method` 函数时,程序首先会在最左侧基类 `B` 寻找该函数——但由于 `B` 没有提供自己的实现,则继续沿链向下直到找到 `C` 提供的具体实现,并由此触发对更高级别的同名成员访问请求直至到达顶层 `A`. #### 实际应用示例 这里给出一个更加贴近实际应用场景的例子,其中展示了怎样在一个具有复杂层次关系的对象模型内合理运用 `super()` : ```python from abc import ABC, abstractmethod class Eater(ABC): @abstractmethod def eat_delicious(self): raise NotImplementedError('Subclasses must implement this!') class Human(Eater): def eat_delicious(self): result = super().eat_delicious() return f"Human eating deliciously after calling superclass's implementation: {result}" human_eater = Human() try: human_eater.eat_delicious() except Exception as e: print(e) ``` 上述代码片段尝试模拟了一个抽象接口 `Eater` 和具体实现者 `Human`. 尽管此处为了简化逻辑省去了其他可能存在的中间层,但是依然可以看出 `super()` 是多么方便地帮助我们构建起了一条清晰明了的方法调用链条[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值