【发布时间】:2017-02-01 05:41:40
【问题描述】:
我正在尝试使用 Python.NET (2.1.0) 从 Python (2.7) 中的抽象 .NET 基类继承。我是 Python n00b,但据我了解……
这是我仅在 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)
现在,我所做的只是将抽象基类 Door 替换为 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 部件中删除 Door 并从 .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 这里是邮件列表中的原始讨论:mail.python.org/pipermail/pythondotnet/2016-September/…
-
嗨@denfromufa,您好像是说您不能使用Python 和Python.Net 从.NET 抽象类继承。请您确认一下吗?谢谢
-
@TomHunter 我不认为这个功能是在 pythonnet 中实现的。随时在问题跟踪器中提交功能请求。
标签: c# python abstract-class metaclass python.net