2015-07-21 58 views
0

我有這段代碼:試圖施放一個對象類型到另一個在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」)。我不知道是什麼與不是建立在其它對象類型這樣做的正確方法。

謝謝

+0

那不是python代碼!? – ypnos

+0

這正是問題:我如何在Python中實現這一點? – konrad

回答

0

你不能準確地投對象在Python中,你也不一般需要因爲Python沒有很強的類型檢查。

技術上,鑄件就好像它是另一種類型的,本質上處理對象作爲正被鑄造成一個新的形狀(術語的由來)的液體金屬解釋現有的對象的數據。在Python中,你可以做的是嘗試對象轉換爲另一種格式。通常是一個對象,該對象可以採取另一個對象作爲輸入將在其構造接受它(例如int()可以採取的字符串以及表示,並將調用__int__()在其它類型的,如果這樣的方法存在,讓其他類型的限定它們是如何轉換的) 。有些種類甚至有替代的構造,如果他們的主要構造不能接受給定類型的對象(例如,XML解析器可能會接受它的主要構造的文件名,並有from_string()from_file()接受字符串和類似文件的對象類的方法, 分別)。

在你給出的例子中,將一種類型的Curve對象轉換成另一種類型,在Python中你可能甚至不需要做任何轉換。該NurbsCurve對象可能支持任何函數接受一個Curve希望看到,即使它不是一個嚴格的子類的方法和屬性Curve。如果它是一個嚴格的子類,那麼肯定沒有問題,也不需要轉換!

Python不檢查參數類型,除非有明確的代碼,這樣做的,而且大部分功能沒有這樣的代碼。相反,他們只是假定調用者不是一個doofus並且已經傳入了一個可以使用的對象。這通常被稱爲「鴨子打字」。

如果一個給定的函數不接受你想要傳入的對象,你可以編寫一個轉換函數,一個多重繼承子類或者一個包裝類來使你的行爲足夠像你需要的類型讓功能工作。但這通常是不需要的,因爲設計API的人不是白癡,在可能的情況下他們會接受他們的慷慨。

相關問題