![](https://secure.gravatar.com/avatar/4be974576167c8b7054921db4d199d92.jpg?s=120&d=mm&r=g)
Hello out there, I'm trying to inherit from an abstract .NET base class in Python (2.7). I'm a Python n00b but from what I understood... Here's what I managed to do in Python only and which works fine: [File: room.py] ------- import abc class Room(object): def __init__(self, door): self.door = door def open(self): self.door.open() def close(self): self.door.close() def is_open(self): return self.door.is_open() 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) ------- Now, all I did was to replace the abstract base class Door by a C# representation: [File: PythonAbstractBaseClass.dll] ------- 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(); } } ------- Removing Door from the Python part and importing it from the .NET assembly instead, I end up with this: [File: room2.py] ------- import clr import abc from PythonAbstractBaseClass import Door class Room(object): def __init__(self, door): self.door = door def open(self): self.door.open() def close(self): self.door.close() def is_open(self): return self.door.is_open() 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) ------- But this fails with the following error message: Door.register(StringDoor) AttributeError: type object 'Door' has no attribute 'register'
From what I understood about abc.ABCMeta, this metaclass contributes the 'register' method. It seems that abstract C# classes do not come with the same metaclass. They instead come with metaclass "CLR Metatype" which obviously does not provide 'register'.
But if I drop the call to 'register', on instantiating one of the derived classes, I receive the error message sdoor = StringDoor() TypeError: cannot instantiate abstract class Is there a way to inherit from an abstract .NET class or is this is missing feature? Thanks in advance, Henning