试图在Python中将一种对象类型转换为另一种对象类型

时间:2015-07-21 22:51:08

标签: python casting ironpython

我有这段代码:

const ON_Curve* curve = ...;

const ON_NurbsCurve* nurb = ON_NurbsCurve::Cast( curve );
if( nurb )
{
ON_Ellipse ellipse;
double tolerance = model.m_settings.m_ModelUnitsAndTolerances.m_absolute_tolerance;
bool rc = nurb->IsEllipse( 0, &ellipse, tolerance );

它将ON_NurbsCurve对象强制转换为ON_Curve对象。我不太确定这在Python中是否可行。我知道我可以把一个字符串转换成一个整数,如:int(" 1")。我不确定使用其他未内置的对象类型的正确方法是什么。

谢谢

1 个答案:

答案 0 :(得分:2)

你不能在Python中精确地转换对象,也不一定需要,因为Python没有强大的类型检查。

从技术上讲,强制转换是将现有对象的数据解释为另一种类型,主要是将对象视为一种液态金属,将其转换为新形状(术语的来源)。在Python中,您可以尝试对象转换为另一种格式。通常,可以将另一个对象作为输入的对象将在其构造函数中接受它(例如int()可以接受字符串和数字,并且如果存在这样的方法,则会在其他类型上调用__int__()来让其他类型定义它们的转换方式)。如果某些类型的主构造函数不能接受给定类型的对象(例如,XML解析器可能在其主构造函数中接受文件名,并且具有from_string()from_file()类方法,则某些类型甚至具有替代构造函数它分别接受字符串和类文件对象。)

在您给出的示例中,将一种类型的Curve对象转换为另一种类型,在Python中您可能甚至不需要进行任何转换。 NurbsCurve对象可能支持Curve的方法和属性,即任何接受Curve的函数都希望看到它,即使它不是严格的子类。如果它一个严格的子类,那么肯定没问题,也不需要转换!

Python不检查参数类型,除非有明确的代码这样做,并且大多数函数没有这样的代码。相反,他们只是假设调用者不是doofus并传递了他们可以使用的对象。这通常被称为“鸭子打字”。

如果给定的函数不接受您想要传入的对象,您可以编写转换函数,多重继承子类或包装类,以使您的行为足够像所需的类型工作的功能。但通常不需要这样做,因为设计API的人不是白痴,并且在可能的情况下会慷慨接受。