fre*_*all 19 c# python abstract-class metaclass python.net
我试图使用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)
Run Code Online (Sandbox Code Playgroud)
现在,我所做的只是用C#表示替换抽象基类Door:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
从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)
Run Code Online (Sandbox Code Playgroud)
但是这失败并出现以下错误消息:
Door.register(StringDoor)
AttributeError: type object 'Door' has no attribute 'register'
Run Code Online (Sandbox Code Playgroud)
根据我的理解abc.ABCMeta,这个元类贡献了这种register()方法.似乎抽象的C#类没有相同的元类.相反,它们带有CLR Metatype明显无法提供的元类register().
但是如果我放弃调用register(),在实例化其中一个派生类时,我收到错误消息
sdoor = StringDoor()
TypeError: cannot instantiate abstract class
Run Code Online (Sandbox Code Playgroud)
有没有办法从抽象的.NET类继承或者这是一个缺少的功能?
提前致谢,
亨宁
您无法在C#中创建抽象类的新实例.也就是说,Python会要求你使用寄存器,因为它不允许你使用你继承的类而不注册它,除非你实例化它.
如果你想继承python中的C#抽象类,你必须在C#类中自己编写python中寄存器类的表示,这样就会注册你的抽象调用并能够继承它.
如果需要,我建议这个网站可以轻松帮助您在代码之间进行转换:
https://www.varycode.com/converter.html
我对pythonnet(或者一般的python)完全不熟悉,但我很好奇这样的事情是否可行:
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1157 次 |
| 最近记录: |