ile yazılmış bir soyut temel sınıfından nasıl devralınırım Python (2.7) 'daki bir soyut .NET temel sınıfından Python.NET (2.1.0) kullanarak miras almaya çalışıyorum. Ben burada C#
Ben sadece Python yapmayı başardı ve iyi çalışır hangi budur ... Ben anladım ne Python n00b ama değilim: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)
Şimdi, tüm yaptığım soyut temel sınıf Kapı değiştirmekti bir C# gösterimi ile:
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 bölümünden Kapı Çıkarma ve yerine NET montaj aktararak, bu ile sonuna kadar:
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)
Ama bu şu hata iletisiyle başarısız olur:
anladım kadarıylaDoor.register(StringDoor)
AttributeError: type object 'Door' has no attribute 'register'
yaklaşık abc.ABCMeta
, bu metaclass register()
yöntemi katkıda bulunur. Görünüşe göre soyut C# sınıfları aynı metaclass ile gelmiyor. Bunun yerine, register()
'u sağlamayacak şekilde CLR Metatype
meta sınıfı ile birlikte gelirler.
register()
çağrısına damla Ama eğer, şu hata mesajını
sdoor = StringDoor()
TypeError: cannot instantiate abstract class
soyut bir .NET sınıfından miras için bir yol var mı alacak yoksa bu eksik
özelliği? peşin
sayesinde
Henning
@TomHunter posta listesindeki orijinal tartışma: böyle bir şey işe yarayabilecek eğer meraklı 'm https://mail.python.org/pipermail/pythondotnet/2016-September/001813.html – denfromufa
Merhaba @denfromufa, senin gibi görünüyor Python ve Python.Net kullanarak bir .NET soyut sınıfından miras kalamayacağınızı söyleyerek .. teyit edebilir misiniz? Teşekkürler –
@TomHunter Bu özelliğin pythonnet'te uygulandığını düşünmüyorum. Konu izleyicide bir özellik isteği göndermek için çekinmeyin. – denfromufa