Closed
Description
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();
}