IronPython中的默认成员/属性

时间:2014-11-18 14:13:01

标签: .net properties ironpython

如果(直接)使用对象实例,是否有可能让IronPython访问对象的默认属性?

IronPython访问的值(在我们的程序中)包含在一些class Variable<T>对象中,始终具有名为Value的T类型的属性。我写的时候

if someBoolVariable:
    print "Hello World"

IronPython检查someBoolVariable != null是否为someBoolVariable.Value,在我们的例子中总是如此。相反,我更愿意检查Temp = someDoubleVariable + someDoubleVariable

数字变量也是如此:

Temp = someDoubleVariable.Value + someDoubleVariable.Value

返回错误,表明类型中未实现add运算符。我想将其自动评估为__value__()

我仍然希望能够访问该对象的其他属性。因此,在超出范围时转换对象是不可能的。我已经尝试附加DefaultMemberAttribute和/或DefaultPropertyAttribute,但这似乎没有任何影响......

修改

对于bool变量(这是其中一个重要组),我找到了答案。但是,对于数值,这也很好。从理论上讲,我可以为所有算术运算创建方法,但是它们数量非常多 - 特别是在混合不同类型的时候......有一些像__self__()或{{1}}这样的东西会更好方法(似乎不存在)只返回要使用的值而不是对象...

2 个答案:

答案 0 :(得分:0)

我找到了布尔语句和表达式的部分解决方案:为了使变量按照我期望的方式运行,你只需要实现一个名为__nonzero__()的特殊函数:

public bool __nonzero__()
{
     return EqualityComparer<T>.Default.Equals(_value, default(T)) == false;
}

如果现在在布尔语句和表达式中使用该对象,则会评估它的值,而不是检查它是否为null

一个缺点:实现此方法的对象必须是公共的,否则python会忽略它。也许还有可能​​将它作为静态函数实现,但是我不知道如何将它注册到python以便它被使用。

答案 1 :(得分:0)

IronPython不支持默认属性(我认为VB是唯一可以使用的语言)。您最好的选择是使用Variable<T>dynamic上实施运算符,这样可以使其易于管理。如果以正常的C#样式重载它们,IronPython将使用它们,或者您可以实现Python的__*__方法。

例如(未经测试):

public static dynamic operator +(Value<t> v, dynamic d) {
  return v._value + d;
}

(嘿,static dynamic。)