Also ich verstehe wirklich nicht, wie Python3 Konstruktoren behandelt. Die meisten Fragen hier scheinen das Problem zu haben, dass ihr Basiskonstruktor nicht genannt wird, ich habe das Problem (denke ich), dass es aufgerufen wird. Was ich versuche zu tun, ist eine Klasse zu definieren, deren Konstruktor eine Bytes Objekte basierend auf einigen anderen Daten im Konstruktor zurückgegeben.Python3: Basiskonstruktor wird implizit aufgerufen
class MyObj(bytes):
def __init__(self, data):
## do stuff to calculate a bytes_object from data
## in the C++ example below, I just reinterpret_cast the data
## call super(MyObj, self).__init__(bytes_object) to invoke
## the copy constructor
pass
construct_MyObj_for_this_data = [0.4,2.5,12.1]
newmyobj = MyObj(construct_MyObj_obj_for_this_data)
Wenn dies in dem Interpreter ausgeführt wird, erhalte ich diese:
TypeError: 'float' object cannot be interpreted as an integer
Es scheint, dass MyObj()
immer die Basis ruft (d Bytes) Konstruktor, die ich nicht will. Übergeben von Werten an MyObj
, die gültige Objekte für den Bytekonstruktor sind, und newmyobj
ruft den Wert dieses Byteobjekts ab. Ich glaube, ich denke zu viel C++ ...
Wenn seine nach wie vor unklar, was ich will, ist hier eine Arbeits C++ Beispiel die richtige Sache zu tun:
#include <vector>
struct list {
float x;
float y;
float z;
};
class MyObj : std::vector<char> {
public:
MyObj(list data) {
this->resize(sizeof(data));
std::copy(reinterpret_cast<char*>(&data)
, reinterpret_cast<char*>(&data.x)+sizeof(data)
, this->begin());
}
};
int main (int argc, char* argv[]) {
list data = {0.4,2.5,12.1};
MyObj newmyobj = MyObj(data);
}
Die MyObj konnte dann überall dort verwendet werden, wo ein std :: vector verwendet werden kann, und alle anderen C++ - Container haben.
Für mich sieht es so aus, als ob Sie versuchen, zwei verschiedene Dinge in Ihren Beispielen zu tun –
Das mag stimmen, aber für mich sehen sie gleich aus, was wahrscheinlich auch Teil meines Problems ist. Um es aufzulösen: In beiden Beispielen leite ich eine Klasse von einer Basisklasse ab, die die Sprache verwendet, um binäre Daten zu speichern. In beiden Beispielen möchte ich Daten an den Konstruktor der abgeleiteten Klasse übergeben, die keine gültigen Daten für die Basisklasse sind, um das Objekt zu initialisieren. – Tasche