我想從使用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類繼承,或者這是一個缺失特徵?
由於提前,
亨寧
@TomHunter是在郵件列表中的原始討論:https://mail.python.org/pipermail/pythondotnet/2016-September/001813.html – denfromufa
Hi @ denfromufa,看起來像你e說你不能從使用Python和Python.Net的.NET抽象類繼承。請你確認一下嗎?謝謝 –
@TomHunter我不認爲這個功能是在pythonnet中實現的。隨意提交問題跟蹤器中的功能請求。 – denfromufa