2016-09-23 18 views
20

Python.NET(2.1.0)を使用してPython(2.7)の抽象.NET基本クラスから継承しようとしています。私はN00Bが、私は理解し何からPythonのよ...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()に電話を落とした場合でも、私はエラーメッセージ

sdoor = StringDoor() 
TypeError: cannot instantiate abstract class 

抽象.NETクラスから継承する方法はありますを受け取るか、この行方不明である

特徴?事前に

おかげで、

ヘニング

+0

@TomHunterがメーリングリストで本来の議論である:このような何かがうまくいくかもしれない場合には好奇心旺盛M」https://mail.python.org/pipermail/pythondotnet/2016-September/001813.html – denfromufa

+0

こんにちは@denfromufa、あなたのようですあなたがPythonとPython.Netを使って.NETの抽象クラスから継承することはできないと言っています。ありがとう –

+0

@TomHunter私はこの機能がpythonnetで実装されたとは思わない。課題トラッカーに機能要求を提出してください。 – denfromufa

答えて

8

あなたがC#での抽象クラスの新しいインスタンスを作成することはできません。つまり、インスタンスを作成しない限り、継承されたクラスを登録せずに使用することはできないため、Pythonではレジスタを使用する必要があります。

PythonでC#抽象クラスを継承したい場合は、C#クラスでPythonで登録クラスの表現を独自に記述する必要があるため、抽象呼び出しを登録して継承できるようになります。

私は簡単に必要な場合はあなたがコード間の変換を助けるためにこのサイトを示唆している:私は完全にpythonnet(またはそのことについては、一般的にのpython)に精通していないよ

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

5

が、私ここ

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) 
関連する問題