当前位置: 首页 > 面试题库 >

在C#中实例化python类

高迪
2023-03-14
问题内容

我已经在python中编写了一个类,希望通过IronPython包装到.net程序集中,并在C#应用程序中实例化。我已经将该类迁移到IronPython,创建了一个库程序集并对其进行了引用。现在,我实际上如何获得该类的实例?

该类看起来(部分地)是这样的:

class PokerCard:
    "A card for playing poker, immutable and unique."

    def __init__(self, cardName):

我用C#编写的测试存根是:

using System;

namespace pokerapp
{
    class Program
    {
        static void Main(string[] args)
        {
            var card = new PokerCard(); // I also tried new PokerCard("Ah")
            Console.WriteLine(card.ToString());
            Console.ReadLine();
        }
    }
}

为了在C#中实例化此类,我必须做什么?


问题答案:

IronPython类
不是.NET类。它们是IronPython.Runtime.Types.PythonType的实例,它是Python元类。这是因为Python类是动态的,并且支持在运行时添加和删除方法,而.NET类则无法做到这一点。

要在C#中使用Python类,您将需要使用ObjectOperations类。此类允许您使用语言本身的语义对python类型和实例进行操作。例如,它在适当时使用魔术方法,将整数自动提升为long等。您可以通过查看源代码或使用反射器来了解有关ObjectOperations的更多信息。

这是一个例子。Calculator.py包含一个简单的类:

class Calculator(object):
    def add(self, a, b):
        return a + b

您可以从.NET 4.0 C#之前的代码中使用它,如下所示:

ScriptEngine engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromFile("Calculator.py");
ScriptScope scope = engine.CreateScope();

ObjectOperations op = engine.Operations;

source.Execute(scope); // class object created
object klaz = scope.GetVariable("Calculator"); // get the class object
object instance = op.Call(klaz); // create the instance
object method = op.GetMember(instance, "add"); // get a method
int result = (int)op.Call(method, 4, 5); // call method and get result (9)

您将需要引用程序集IronPython.dll,Microsoft.Scripting和Microsoft.Scripting.Core。

C#4通过 新的 动态类型使此操作变得更加容易。

ScriptEngine engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromFile("Calculator.py");
ScriptScope scope = engine.CreateScope();
source.Execute(scope);

dynamic Calculator = scope.GetVariable("Calculator");
dynamic calc = Calculator();
int result = calc.add(4, 5);

如果将Visual Studio 2010或更高版本用于NuGet支持,则只需执行此操作即可下载并引用适当的库。

Install-Package IronPython


 类似资料:
  • 本文向大家介绍C#中Serializable序列化实例详解,包括了C#中Serializable序列化实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中Serializable序列化。分享给大家供大家参考。具体分析如下: 概述: 序列化就是是将对象转换为容易传输的格式的过程,一般情况下转化打流文件,放入内存或者IO文件 中。例如,可以序列化一个对象,然后使用 HTTP 通过 I

  • 我正在做大学课程,并试图用GLFW建立一个窗口。我一直在关注我们要关注的文档和视频系列(Youtube上Cherno的Hazel引擎),但遇到了抽象类的问题。 我真的很难理解指针和抽象,所以我真的很难理解我在做什么,但我相信它试图从Window调用继承的“create”函数来构建WinWindow(之所以这样命名是因为它是Windows操作系统特有的),但我在WinWindow的第9行得到一个错误

  • 本文向大家介绍Python中类的创建和实例化操作示例,包括了Python中类的创建和实例化操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python中类的创建和实例化操作。分享给大家供大家参考,具体如下: python中同样使用关键字class创建一个类,类名称第一个字母大写,可以带括号也可以不带括号; python中实例化类不需要使用关键字new(也没有这个关键字),类的实例化

  • 问题内容: 我有一个由外部库提供的类。我已经创建了该类的子类。我也有一个原始类的实例。 现在,我想将此实例转换为我的子类的一个实例,而不更改该实例已经具有的任何属性(但无论如何,我的子类都会覆盖这些属性)。 以下解决方案似乎有效。 但是,我不认为该解决方案没有包含我从未想到的警告(对三重否定表示抱歉),尤其是因为重新分配魔术师感觉不对。即使这行得通,我也不禁感到应该有一种更Python化的方式来做

  • 问题内容: 我知道Java的泛型在某种程度上逊于.Net。 我有一个泛型类,我确实需要使用无参数构造函数实例化。如何解决Java的局限性? 问题答案: 一种选择是传递(或你感兴趣的任何类型-以任何方式指定适当的引用)并将该值保留为字段: 另一种选择是具有“工厂”接口,然后将工厂传递给泛型类的构造函数。这更加灵活,你无需担心反射异常。

  • Selenium FindBy注释是否实际实例化了WebElement实例,如果是,使用它们的框架的内涵是什么? 我在我的页面对象中所做的事情现在看起来是这样的。我的所有测试框架方法都将定位器作为参数(而不是WebElement实例)。 我的问题是,在类实例化时使用FindBy实例化WebElement实例吗?如果是这样,那么我怀疑我的框架方法需要使用WebElement实例。这是正确的吗,在框架