python super返回值
时间: 2023-07-12 14:04:10 浏览: 89
在 Python 中,super() 函数用于调用父类的方法,它的返回值是一个 super 对象。这个对象可以用来调用父类的方法,不需要显式地指定父类的名称,而且还可以避免硬编码。
在使用 super() 调用父类方法时,可以传递两个参数:第一个参数是当前类对象的类型(即类本身),第二个参数是当前类对象的实例。super() 函数返回的对象中包含了当前类和实例的信息,因此可以在调用父类方法时使用这些信息。
super() 函数的返回值常用于调用父类的构造函数和普通方法,以及在多重继承中解决方法名冲突的问题。
相关问题
python函数不返回值
### Python 函数不返回值的原因
当 Python 函数执行完毕而未遇到 `return` 语句时,默认会返回特殊对象 `None`。这表示该函数实际上是有返回值的,只是这个返回值是 `None` 而已[^1]。
```python
def func_without_return():
pass
result = func_without_return()
print(result is None) # 输出 True
```
如果希望函数能够提供有意义的结果,则应在适当位置加入 `return` 语句来指定要返回的数据。
### 如何使 Tkinter 按钮回调函数有返回值
对于Tkinter按钮点击事件处理程序而言,由于这些方法通常是在GUI主线程内异步触发的,因此无法直接获取它们的实际返回值[^4]。不过可以通过其他方式间接取得所需数据:
- **全局变量法**
利用外部作用域中的可变容器(如列表或字典),由回调函数更新其中的内容;
```python
from tkinter import *
root = Tk()
data_container = []
def on_button_click():
global data_container
value_to_store = "some computed result"
data_container.append(value_to_store)
Button(root, text="Click Me", command=on_button_click).pack()
mainloop()
print(data_container[-1]) # 访问最后存储的结果
```
- **类属性保存结果**
创建自定义控件类,在实例成员里维护状态信息;
```python
class MyButton(Button):
def __init__(self, master=None, cnf={}, **kw):
super().__init__(master, cnf, kw)
self.result_storage = []
def handle_click(self):
new_result = "another calculated outcome"
self.result_storage.append(new_result)
my_btn = MyButton(text='Press Here', command=my_btn.handle_click)
my_btn.pack()
mainloop()
print(my_btn.result_storage[-1])
```
这两种策略都可以有效地绕过直接捕获回调函数返回值的问题。
Python super方法
### 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].
阅读全文