【问题标题】:Default members/properties in IronPythonIronPython 中的默认成员/属性
【发布时间】:2014-11-18 14:13:01
【问题描述】:

如果(直接)使用对象实例,是否有可能让 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

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

编辑:

对于布尔变量(这是其中的一个重要组),我找到了答案。但是,对于数值,这也很好。从理论上讲,我可以为所有算术运算创建方法,但它们的数量非常多——尤其是在混合不同类型时......最好有类似 __value__()__self__() 的方法(它确实似乎不存在)它只是返回要使用的值而不是对象......

【问题讨论】:

  • 为什么这个标签是C#
  • 其他语言支持吗?我知道 VB 在定义索引器时使用了这个术语,但我从未见过它在你想要的上下文中使用。
  • IronPython 脚本在 C# 应用程序中使用,因此所有类/对象都在 C# 中定义。
  • 您可能应该标记 .net 或 clr 而不是 C#。您是否考虑过使用 implicit converters 来处理数字类型的展开?
  • 我已将 C# 更改为 .net。但是,隐式转换运算符仅在将值分配给变量时(仅适用于 C# 等静态类型语言)或调用需要目标类型的函数时使用。它们不用于算术运算符。

标签: .net properties ironpython


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    IronPython 不支持默认属性(我认为 VB 是唯一支持的语言)。最好的办法是使用dynamicVariable&lt;T&gt; 上实现运算符,这应该使它易于管理。如果您以普通 C# 样式重载它们,IronPython 将使用它们,或者您可以实现 Python 的 __*__ 方法。

    例如(未经测试):

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

    (呵呵,static dynamic.)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 2015-08-27
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      相关资源
      最近更新 更多