我想从使用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