【发布时间】:2017-12-08 00:38:04
【问题描述】:
所以我真的不明白 Python3 是如何处理构造函数的。这里的大多数问题似乎都存在 not 调用它们的基本构造函数的问题,我遇到了(我认为)它被调用的问题。 我要做的是定义一个类,其构造函数根据构造函数中传递的一些其他数据返回字节对象。
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 这是字节构造函数的有效对象,newmyobj 获取该字节对象的值。
我相信我想太多 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++ 容器所具有的所有其他便利。
【问题讨论】:
-
对我来说,看起来您在示例中尝试做两件不同的事情
-
这可能是真的,但对我来说它们看起来一样,这可能也是我的问题的一部分。将其分解:在这两个示例中,我从语言用来存储二进制数据的基类派生一个类。在这两个示例中,我想将数据传递给派生类的构造函数,这对于基类来说不是有效数据,以初始化对象。
标签: python python-3.x constructor derived-class