<>你声称你会用超载(我假设)C++来做这个。但是除了<code>name</code>之外的所有参数都是相同的类型。很明显,你只是在重载参数的数量,而不是类型。像这样:</p>
<pre><code>ClassName(string name, double x, double y, double z,
double mass, double inertia) :
name_(name), x_(x), y_(y), z_(z),
cg_x_(0), cg_y_(0), cg_z(0),
mass_(mass), inertia_(inertia) {}
ClassName(string name, double x, double y, double z,
double cg_x, double cg_y, double cg_z,
double mass, double inertia) :
name_(name), x_(x), y_(y), z_(z),
cg_x_(cg_x), cg_y_(cg_y), cg_z(cg_z),
mass_(mass), inertia_(inertia) {}
</code></pre>
<p>您想知道如何在Python中执行类似的操作</p>
<p>最好的方法可能是:</p>
<pre><code>def __init__(self, name, x, y, z, *args):
self.name, self.x, self.y, self.z = name, x, y, z
if len(args) == 2:
self.cg_x = self.cg_y = self.cg_z = 0
self.mass, self.inertia = args
else:
self.cg_x, self.cg_y, self.cg_z, self.mass, self.inertia = args
</code></pre>
<p>尽管你可以做一些类似的事情:</p>
<pre><code>def __init__(self, name, x, y, z, cg_x_or_mass, cg_y_or_inertia,
cg_z=None, mass=None, inertia=None):
self.name, self.x, self.y, self.z = name, x, y, z
if cg_z is None:
self.cg_x = self.cg_y = self.cg_z = 0
self.mass, self.inertia = cg_x_or_mass, cg_y_or_inertia
else:
self.cg_x, self.cg_y, self.cg_z = cg_x_or_mass, cg_y_or_inertia, cg_z
self.mass, self.inertia = mass, inertia
</code></pre>
<p>不管怎样,这都有点难看。重载在Python中总是有点难看;我们鼓励您使用关键字参数或替代构造函数,或者在某些情况下在构造之后设置一些“可选”属性。但有时也有用</p>
<hr/>
<p>你还提到了RTTI。Python的RTTI比C++更优秀。您可以为任何对象编写<code>type(spam)</code>,并返回一个类对象(一个<code>type</code>或其他一些元类的实例);您可以使用<code>vars</code>函数检查它的<code>__dict__</code>,您可以使用<code>inspect</code>模块对对象或其类型执行各种操作,或者,使用第三方模块,您可以获得类似Dylan或类似Common Lisp的多分派(类似于虚拟函数,但是打开所有参数的类型,而不仅仅是<code>self</code>)。但我不知道你会怎么用这些。如果参数的运行时类型在某种程度上是相关的,那就很容易了;例如<code>isinstance(cg_x_or_mass, int)</code>将告诉您<code>cg_x_or_mass</code>是否是<code>int</code>。但我不知道你会怎么做</p>