2017-07-04 2 views
1

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.

+0

Für mich sieht es so aus, als ob Sie versuchen, zwei verschiedene Dinge in Ihren Beispielen zu tun –

+0

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

Antwort

1

Die __init__() ist nicht der Erbauer. Sie müssen __new__() implementieren, was wirklich der Konstruktor ist. Zum Beispiel:

class MyObj(bytes): 
    def __new__(cls, data): 
     # do operations here 
     # dummy example 
     new_data = [int(x) for x in data] 
     return super().__new__(cls, new_data) 

newmyobj = MyObj([0.4,2.5,12.1]) 

Auch sind bytes unveränderlich. Daher könnte es etwas zu spät sein, etwas in __init__() zu tun.

Verwandte Themen