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

Trying to cast one object type into another in Python

我有这段代码:

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")。我不确定使用其他非内置对象类型的正确方法是什么。

谢谢

您不能完全转换 Python 中的对象,通常也不需要,因为 Python 没有强大的类型检查。

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

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

Python 不检查参数类型,除非有明确的代码这样做,而且大多数函数没有这样的代码。相反,他们只是假设调用者不是傻瓜,并且已经传入了一个他们可以使用的对象。这通常称为 "duck typing."

如果给定函数不接受您要传入的对象,您可以编写一个转换函数、一个多重继承子class或一个包装器class来制作什么您的行为足够像使功能正常工作所需的类型。但这通常是不需要的,因为设计 API 的人不是白痴,他们会在可能的情况下大方地接受。