簡體   English   中英

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是唯一的語言)。 最好的選擇是使用dynamicVariable<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM