Python3 : Base Constructor getting called implicitly

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

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

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)

如果这是在解释器中运行,我会得到:

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

似乎 MyObj() 总是调用 Base(即字节)构造函数,这是我不想要的。将值传递给 MyObj ,这些值是 bytes 构造函数的有效对象,并且 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++ 容器所具有的功能。

最佳答案

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

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

关于Python3 : Base Constructor getting called implicitly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44907662/

相关文章:

python - 在从 Python 调用的 C 函数中使用 PyFloat_FromDouble 时获得错误结果

python - 将行解析为单独的段 - python

c++ - 具有可变构造函数的类模板;将参数存储到 std::vector< std::shared_ptr<>>

java - 向我解释一下这些构造函数在这个程序中做了什么?

python - 来自 dialogAction(Python) 的空响应

python - 在 Google Cloud Endpoints 中返回自定义 HTTP 错误原因

python - 运行 openmdao 1.7.0 GUI

python - 类范围的异常处理程序

python-3.x - 在 ete3 中为热图添加标签

c# 发出动态方法委托(delegate)以加载参数化构造函数问题