2016-09-23 40 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)