Skip to content

Can not call method in parent class, when using nested classes with inheritance #1420

Closed
@koliyo

Description

@koliyo

Environment

Pythonnet version: 2.5.1
Python version: Python 3.9.2
Operating System: MacOS
.NET Runtime: 5.0.200

Details

Related to the problem reported in #1414

I.e. classes-in-classes are not handled properly in Pythonnet.

Even when applying the workaround mentioned in the #1414 issue there are still problems related to the inheritance.

Namely, I can not call a method declared on the baseclass, on an instance of the nested child class.

The following code demonstrates the issue

namespace pythonnet_testing {

  public class Bar {

    public string MethodInBaseClass() {
      return "hello";
    }

    public class Hej : Bar {
    }
  }

  public class Foo {
    public Bar Bar;

    public static Foo Create() {
      Foo f = new();
      f.Bar = new Bar.Hej();
      return f;
    }
  }

  class Program {
    static void Main(string[] args) {

      var pyCode = @"
import pythonnet_testing
f = pythonnet_testing.Foo.Create()
print('Trying to access member of nested subclass')
_ = pythonnet_testing.Bar # NOTE: The python code crashes unless this explicit reference to the Bar class is used
print(f'Bar: {f.Bar}')
print(f'Method call: {f.Bar.MethodInBaseClass()}')

      ";

      PythonEngine.Initialize();

      using (Py.GIL()) {
        PythonEngine.Exec(pyCode);
      }
    }
  }

Running this gives the following error message

Trying to access member of nested subclass
Bar: pythonnet_testing.Bar+Hej
Unhandled exception. Python.Runtime.PythonException: AttributeError : 'Hej' object has no attribute 'MethodInBaseClass'
['  File "<string>", line 7, in <module>\n']   at Python.Runtime.PythonException.ThrowIfIsNull(BorrowedReference reference)
   at Python.Runtime.PythonEngine.RunString(String code, Nullable`1 globals, Nullable`1 locals, RunFlagType flag)

In order to call the MethodInBaseClass method on the child class, I must explicitly re-define it like this:

    public class Hej : Bar {
      public new string MethodInBaseClass() => base.MethodInBaseClass();
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions