Python3:隐式调用基本构造函数

时间:2017-07-04 13:44:03

标签: python python-3.x constructor derived-class

所以我真的不明白Python3如何处理构造函数。这里的大多数问题似乎都有他们的基础构造函数被调用的问题,我已经遇到问题(我认为)它被调用了。 我要做的是定义一个类,其构造函数根据构造函数中传递的其他数据返回一个bytes对象。

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)

如果在Interpreter中运行,我会得到:

TypeError: 'float' object cannot be interpreted as an integer

似乎MyObj()总是调用Base(即bytes)构造函数,这是我不想要的。将值传递给MyObj这些是字节构造函数的有效对象,并且newmyobj获取该bytes对象的值。 我相信我在想太多C ++ ......

如果仍然不清楚我想要什么,这是一个正在运行的C ++示例做正确的事情:

#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);
}

然后可以在任何地方使用MyObj,其中可以使用std :: vector,并拥有C ++容器所具有的所有其他便利。

1 个答案:

答案 0 :(得分:1)

__init__()不是构造函数。你需要实现__new__(),它实际上是构造函数。例如:

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])

bytes也是不可变的。因此,在__init__()中执行某些操作可能为时已晚。