Python3: 基础构造函数被隐式调用
Python3: Base Constructor getting called implicitly
所以我真的不明白Python3是如何处理构造函数的。这里的大多数问题似乎都存在这样的问题,即它们的基本构造函数未被调用 not,我遇到了(我认为)它被调用的问题。
我想要做的是定义一个 class 其构造函数 returns 一个基于构造函数中传递的其他数据的字节对象。
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])
另外 bytes
是不可变的。因此,在 __init__()
中做某事可能为时已晚。
所以我真的不明白Python3是如何处理构造函数的。这里的大多数问题似乎都存在这样的问题,即它们的基本构造函数未被调用 not,我遇到了(我认为)它被调用的问题。 我想要做的是定义一个 class 其构造函数 returns 一个基于构造函数中传递的其他数据的字节对象。
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])
另外 bytes
是不可变的。因此,在 __init__()
中做某事可能为时已晚。