2016-09-23 42 views
20

我想从使用Python.NET(2.1.0)的Python(2.7)中的抽象.NET基类继承。我是一个Python的n00b,但是从我的理解......如何从用C#编写的抽象基类继承

这是我管理只在Python中做并正常工作:

import abc 

class Door(object): 
    __metaclass__ = abc.ABCMeta 

    def open(self): 
     if not self.is_open(): 
      self.toggle() 

    def close(self): 
     if self.is_open(): 
      self.toggle() 

    @abc.abstractmethod 
    def is_open(self): 
     pass 

    @abc.abstractmethod 
    def toggle(self): 
     pass 

class StringDoor(Door): 
    def __init__(self): 
     self.status = "closed" 

    def is_open(self): 
     return self.status == "open" 

    def toggle(self): 
     if self.status == "open": 
      self.status = "closed" 
     else: 
      self.status = "open" 

class BooleanDoor(Door): 
    def __init__(self): 
     self.status = True 

    def is_open(self): 
     return self.status 

    def toggle(self): 
     self.status = not (self.status) 

Door.register(StringDoor) 
Door.register(BooleanDoor) 

现在,我所做的只是更换抽象基类门由C#表示:

namespace PythonAbstractBaseClass 
{ 
    public abstract class Door 
    { 
     public virtual void Open() 
     { 
      if (!IsOpen()) 
       Toggle(); 
     } 

     public virtual void Close() 
     { 
      if (IsOpen()) 
       Toggle(); 
     } 

     public abstract bool IsOpen(); 
     public abstract void Toggle(); 
    } 
} 

从Python部卸下门和从.NET组件导入代替它,我结束了这一点:

import clr 
import abc 
from PythonAbstractBaseClass import Door 

class StringDoor(Door): 
    def __init__(self): 
     self.status = "closed" 

    def is_open(self): 
     return self.status == "open" 

    def toggle(self): 
     if self.status == "open": 
      self.status = "closed" 
     else: 
      self.status = "open" 

class BooleanDoor(Door): 
    def __init__(self): 
     self.status = True 

    def is_open(self): 
     return self.status 

    def toggle(self): 
     self.status = not (self.status) 

Door.register(StringDoor) 
Door.register(BooleanDoor) 

但这种失败,出现以下错误信息:

Door.register(StringDoor) 
AttributeError: type object 'Door' has no attribute 'register' 

从我的理解有关abc.ABCMeta,这有助于元类的register()方法。看起来抽象的C#类不会带有相同的元类。他们反而带有元类CLR Metatype,显然不提供register()

但是,如果我把电话给register(),在实例化一个派生类,我收到错误消息

sdoor = StringDoor() 
TypeError: cannot instantiate abstract class 

有没有办法从一个抽象的.NET类继承,或者这是一个缺失特征?

由于提前,

亨宁

+0

@TomHunter是在邮件列表中的原始讨论:https://mail.python.org/pipermail/pythondotnet/2016-September/001813.html – denfromufa

+0

Hi @ denfromufa,看起来像你e说你不能从使用Python和Python.Net的.NET抽象类继承。请你确认一下吗?谢谢 –

+0

@TomHunter我不认为这个功能是在pythonnet中实现的。随意提交问题跟踪器中的功能请求。 – denfromufa

回答

8

您不能创建在C#中的抽象类的新实例。那么Python会要求你使用这个寄存器,因为它不允许你在没有注册的情况下使用你的继承类,除非你实例化它。

如果你想从Python中的C#抽象类继承,你将不得不自己写在你的C#类的Python中的注册类的表示,因此将注册你的抽象调用,并能够从它继承。

我建议这个网站,轻松帮你的代码之间的转换,如果需要:

https://www.varycode.com/converter.html

5

我完全不熟悉pythonnet(或Python一般为此事),但我很好奇,如果这样的事情可能工作:这里

import clr 
import abc 
from PythonAbstractBaseClass import Door 

class DoorWrapper(Door): 
    __metaclass__ = abc.ABCMeta 

class StringDoor(DoorWrapper): 
    ... 

class BooleanDoor(DoorWrapper): 
    ... 

DoorWrapper.register(StringDoor) 
DoorWrapper.register(BooleanDoor)