如果(直接)使用对象实例,是否有可能让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}}这样的东西会更好方法(似乎不存在)只返回要使用的值而不是对象...
答案 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
。)