|
|
1
4
我不是Python开发人员,但一般来说,最好避免在构造函数中进行复杂/容易出错的操作。解决这个问题的一种方法是在类中放置一个“loadfromfile”或“init”方法来从外部源填充对象。然后,必须在构造对象之后单独调用此加载/初始化方法。 |
|
|
2
32
C++中的构造函数与
python有一个更干净的两阶段结构(构造,然后
初始化)。然而,许多人混淆了
回答您的问题:
这不完全正确。如果
在python中,初始化
更新 [关于资源管理]: 在垃圾收集语言中,如果您处理的是资源,特别是有限的资源,如数据库连接,最好不要在析构函数中释放它们。 这是因为对象是以一种非确定性的方式被破坏的,如果发生这种情况, 要有一个引用循环(这并不总是容易辨别的),并且循环中至少有一个对象定义了析构函数,它们将永远不会被销毁。 垃圾收集语言还有其他处理资源的方法。在python中,它是 with statement . |
|
|
3
20
至少在C++中,在构造函数中放置容易出错的代码并没有什么错误——如果发生错误,只需抛出异常即可。如果需要代码来正确地构造对象,那么实际上没有其他选择(尽管您可以将代码抽象为子函数,或者更好地抽象为子对象的构造函数)。最糟糕的做法是半构造对象,然后期望用户调用其他函数以某种方式完成构造。 |
|
|
4
4
从本质上来说,这并不是一个坏习惯。 但我认为你可能在追求一种不同的东西。在您的示例中,当MyClass构造函数失败时,将不会调用doSomething()方法。尝试以下代码:
它应该打印:
对于您的软件设计,您可以问以下问题:
|
|
|
5
3
一种常见的模式是两阶段结构,安迪·怀特也提出了这种模式。 第一阶段:常规构造函数。 第二阶段:可能失败的操作。 二者的集成:添加一个工厂方法来完成这两个阶段,并使构造函数受到保护/私有化,以防止在工厂方法之外进行实例化。 哦,我不是Python开发人员。 |
|
|
6
0
如果初始化各种值的代码非常广泛,以至于复制它是不可取的(在您的情况下听起来是这样),我个人会选择将所需的初始化放入一个私有方法中,添加一个标志以指示初始化是否发生,并使所有访问器调用初始化方法(如果尚未初始化)。 在线程场景中,您可能需要添加额外的保护,以防有效语义只允许进行一次初始化(这可能是,也可能不是,因为您处理的是一个文件)。 |
|
|
7
0
再说一次,我对Python没有什么经验,但是在C语言中,最好尝试避免使用抛出异常的构造函数。之所以会想到这一点的一个例子是,如果您希望将构造函数放在一个不可能用try catch块包围它的点上,例如初始化类中的字段:
如果mysecondclass的构造函数抛出了一个您希望在myclass内部处理的异常,那么您需要重构上面的异常——这肯定不是世界末日,而是一个很好的异常。 在这种情况下,我的方法可能是将容易出错的初始化逻辑移动到初始化方法中,并让getter在返回任何值之前调用该初始化方法。 作为优化,您应该让getter(或初始化方法)将某种“IsInitialized”布尔值设置为true,以指示不需要再次进行(可能代价高昂)初始化。 在伪代码中(C因为我会把python的语法搞乱):
这当然不是线程安全的,但我不认为多线程是在Python中常用的,所以这对您来说可能是一个没有问题的问题。 |
|
|
8
0
尼尔似乎有一个很好的观点:我的朋友刚刚指给我: http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization 这基本上就是尼尔说的… |
|
KiraHoneybee · 具有构造函数参数的模板化类 4 年前 |
|
|
nick2225 · 隐式调用复制构造函数? 4 年前 |
|
|
nohaga · 为什么在本例中p3需要默认构造函数? 4 年前 |
|
|
Aadil Hoda · 为什么类类型的成员需要初始化? 4 年前 |
|
|
EloiGG · 具有任意类型的变量的可数的C++函数 4 年前 |