python super【python】
·
Python 中 super 在这段代码中的作用,类似于 C++ 中子类构造函数在初始化列表中显式调用父类构造函数的操作,核心都是“在子类初始化时,主动触发父类的构造逻辑,确保父类成员被正确初始化”。
具体对比分析:
你的代码中,Cat 类通过 super(Cat, self).__init__(name) 显式调用了父类 Animal 的 __init__ 方法。这一行为在 C++ 中对应的是“子类构造函数在初始化列表中调用父类构造函数”。
1. Python 代码中 super 的作用
class Animal:
def __init__(self, name):
self.name = name # 父类初始化 name
print("Animal __init__ 被调用")
class Cat(Animal):
def __init__(self, name, breed):
# 用 super 调用父类 Animal 的 __init__,传入 name 参数
super(Cat, self).__init__(name) # 核心:触发父类初始化
self.breed = breed # 子类自己初始化 breed
print("Cat __init__ 被调用")
# 实例化 Cat 时,会先执行父类 Animal 的 __init__,再执行子类 Cat 的 __init__
cat = Cat("zhangsan", "胖猫")
输出:
Animal __init__ 被调用 # 父类初始化先执行
Cat __init__ 被调用 # 子类初始化后执行
2. 对应的 C++ 代码(显式调用父类构造函数)
#include <iostream>
#include <string>
using namespace std;
class Animal {
private:
string name; // 父类成员
public:
// 父类构造函数
Animal(string name) : name(name) { // 初始化父类的 name
cout << "Animal 构造函数被调用" << endl;
}
};
class Cat : public Animal { // Cat 继承自 Animal
private:
string breed; // 子类成员
public:
// 子类构造函数:在初始化列表中显式调用父类构造函数
Cat(string name, string breed) : Animal(name), breed(breed) { // 核心:调用父类构造函数
cout << "Cat 构造函数被调用" << endl;
}
};
int main() {
// 实例化 Cat 时,先执行父类 Animal 的构造函数,再执行子类 Cat 的构造函数
Cat cat("zhangsan", "胖猫");
return 0;
}
输出:
Animal 构造函数被调用 // 父类构造先执行
Cat 构造函数被调用 // 子类构造后执行
核心共性:
- 两者的目的一致:在子类初始化时,主动触发父类的构造逻辑,确保父类的成员(如
Animal中的name)被正确初始化,避免父类功能缺失。 - 调用时机一致:都是在子类构造过程的早期阶段(Python 中
super调用通常放在子类__init__开头;C++ 中放在初始化列表,早于子类构造函数体执行)。
细微差异:
- Python 中
super是一个函数,通过“类名 + 实例”定位父类(支持多继承的方法解析顺序 MRO);C++ 中直接通过“父类名 + 参数”调用,仅支持单继承或明确的多继承父类。 - C++ 中如果子类不显式调用父类构造函数,编译器会自动调用父类的默认构造函数(无参);而 Python 中如果子类
__init__不调用super,父类__init__永远不会被执行(需手动调用)。
实际场景
用python:子类重写了send方法,想复用父类原始发送逻辑
# 子类重写了send方法,想复用父类原始发送逻辑
def send(self, frame):
# 先做RTU串口专属预处理
self.clear_echo_buffer()
# 调用父类原始发送报文逻辑
super(RtuMaster, self).send(frame)
用c++:子类重写了send方法,想复用父类原始发送逻辑
// 父类 Master
class Master
{
public:
// 虚函数,允许子类重写
virtual void send(std::string frame)
{
// 父类原始发送逻辑(通用Modbus报文发送)
printf("父类原始send:%s\n", frame.c_str());
}
};
// 子类 RtuMaster 继承 Master
class RtuMaster : public Master
{
public:
// 子类重写send
void send(std::string frame) override
{
// 1. 先执行子类专属预处理(对应Python clear_echo_buffer)
clear_echo_buffer();
// 2. 【核心】调用父类原始send逻辑
Master::send(frame);
// 3. 子类后置自定义逻辑
after_send_handle();
}
private:
void clear_echo_buffer() { /* 485回显清空 */ }
void after_send_handle() { /* 发送后时序处理 */ }
};
总结
你代码中 super 的作用,最接近 C++ 中“子类构造函数在初始化列表中显式调用父类构造函数”的操作——本质都是“在子类初始化时,确保父类完成自己的初始化工作”,是面向对象中“继承与初始化”的核心机制。
更多推荐


所有评论(0)