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