![](/img/trans.png)
[英]How can I access the overridden properties of a .NET API object in IronPython?
[英]Default members/properties in IronPython
如果(直接)使用對象實例,是否可以使IronPython訪問對象的默認屬性?
IronPython訪問的值(在我們的程序中)包裝在某些class Variable<T>
對象中,該對象始終具有名為Value的T
類型的屬性。 當我寫
if someBoolVariable:
print "Hello World"
IronPython檢查someBoolVariable != null
,在我們的情況下始終為true。 相反,我希望它是否檢查someBoolVariable.Value
。
對於數字變量也是如此:
Temp = someDoubleVariable + someDoubleVariable
返回一個錯誤,指出該類型未實現add運算符。 我想讓它自動評估為Temp = someDoubleVariable.Value + someDoubleVariable.Value
。
我仍然希望能夠訪問該對象的其他屬性。 因此,超出范圍時無法轉換對象。 我已經嘗試附加DefaultMemberAttribute和/或DefaultPropertyAttribute,但這似乎沒有任何效果。
編輯:
對於布爾變量(這是其中的重要一組),我找到了答案。 但是,對於數值,這也很好。 從理論上講,我可以為所有算術運算方法,但也有一個非常大的數量的人-混合不同類型的尤其是當......這將是更好的有東西像一個__value__()
或__self__()
方法(它做似乎不存在),它只是返回要使用的值而不是對象...
我找到了布爾語句和表達式的部分解決方案:要使變量按我期望的方式運行,您只需實現一個名為__nonzero__()
的特殊函數:
public bool __nonzero__()
{
return EqualityComparer<T>.Default.Equals(_value, default(T)) == false;
}
如果現在在布爾語句和表達式中使用該對象,則將對它的值求值,而不是檢查它是否為null
。
一個缺點:實現此方法的對象必須是公共的,否則python將忽略它。 也可能將其實現為靜態函數,但是我不確定如何將其注冊到python以便使用。
IronPython不支持默認屬性(我認為VB是唯一的語言)。 最好的選擇是使用dynamic
在Variable<T>
上實現運算符,這應該使其易於管理。 如果以常規C#樣式重載它們,IronPython將使用它們,或者可以實現Python的__*__
方法。
例如(未測試):
public static dynamic operator +(Value<t> v, dynamic d) {
return v._value + d;
}
(嘿, static dynamic
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.