2016-09-23 2 views
20

Python.NET (2.1.0)을 사용하여 Python (2.7)에서 추상 .NET 기본 클래스를 상속하려고합니다. 내가 여기 C#으로 작성된 추상 기본 클래스에서 상속하는 방법

가 난 단지 파이썬에서 어떻게 관리하고 잘 작동하는 무슨 ... 난 이해 것과 파이썬 n00b하지만 해요 :

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(); 
    } 
} 

파이썬 부분에서 문을 제거하고 대신 .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# 클래스는 동일한 메타 클래스가없는 것으로 보입니다. 그들은 대신에 register()을 제공하지 않는 메타 클래스 CLR Metatype을 제공합니다.

나는 파생 클래스 중 하나를 인스턴스화에 register()에 전화를 떨어 뜨리면, 나는 오류 메시지

sdoor = StringDoor() 
TypeError: cannot instantiate abstract class 

추상 .NET 클래스에서 상속 할 수있는 방법이 있나요를 수신하거나이 누락 된 것입니다

특색? 사전에

감사합니다,

헤닝

+0

@TomHunter 메일 링리스트에있는 원래의 설명이다 : 이런 식으로 뭔가가 작동 할 경우 호기심 'https://mail.python.org/pipermail/pythondotnet/2016-September/001813.html – denfromufa

+0

안녕하세요 @denfromufa, 당신처럼 보인다 ar 당신이 Python과 Python.Net을 사용하는 .NET 추상 클래스로부터 상속받을 수 없다는 것을 말하라. 감사합니다 –

+0

@ TomHunter 나는이 기능이 pythonnet에서 구현되었다고 생각하지 않습니다. 이슈 트래커에서 기능 요청을 제출하십시오. – denfromufa

답변

8

당신은 C#에서 추상 클래스의 새 인스턴스를 만들 수 없습니다. 즉, 파이썬은 등록하지 않고 상속 된 클래스를 사용할 수 없으므로 등록을 사용하도록 요구합니다.

파이썬에서 C# 추상 클래스를 상속하려면 파이썬에서 C# 클래스의 등록 클래스 표현을 직접 작성해야하므로 추상 호출을 등록하고 상속 할 수 있어야합니다 .

이 사이트를 제안

쉽게 필요로하는 경우는 코드 사이의 변환 도움 :

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

5

나는 (그 문제에 관해서는 일반적으로 또는 파이썬) pythonnet에 완전히 익숙하지 않은,하지만 난 여기

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) 
관련 문제