Correct. self.conv1 is exactly the same thing that’s been assigned to it in __init__, which is that Conv2d module.
Why don’t you want to use inheritance? There’s no way to use the Module API without it. That’s the design. It is still possible to write purely functional code, without any modules, but I think it ends up being more complicated. You can find an example here 15. Not sure what other example would you like to see.