I'd just chime in: Python is a little odd in this regard (compared to other common OO languages like Ruby, JS, Java, C#, C++, ...)
Notice that in Python, you add self as an explicit parameter at the site of the method declaration:
class Foo:
def my_method(self, arg1, arg2):
print(self, arg1, arg2)
But not at the call site:
my_object = Foo()
my_object.my_method("arg 1", "arg 2")
Notice it's not:
my_object.my_method(my_object, "arg 1", "arg 2") // ❌
So even Python has this same "self is passed in implicitly for you" behavior.
Interestingly, you can actually give the first parameter of a method any name you want (it's doesn't need to be self), e.g. you could use the Java/C#/C++ convention of this instead, if you wanted. But don't do that: it's not pythonic.
I think this is true for C++ instance method also.
Nope, C++ methods have an implicit this, which is a pointer to the receiver of the method call. It's not declared at the method declaration or definition, nor passed explicitly at the method call site.