My initial thinking is that in order to draw, move, or detect collisions for the player you need access to the players location/size/rect.
Single Responsibility Principle still applies.
In most modern systems, a "game object" has the single responsibility of being a container.
They don't draw, they don't move, they don't animate, they don't collide, they don't have sprites. However, they might contain components which cause the container to move, or cause a mesh to animate, or provide a physics shape, or provide a physics response, or link to a mesh, or link to a sprite.
Commonly they will contain a transformation object, and it is so common that many systems turn the transform object into a requirement with its own accessor/mutator pair or maybe even allow direct access to the transform data member.
Many also have a name, but some systems do not. This also typically has an accessor/mutator pair so access is controlled.
Everything else is typically added as a component. A mesh component and a texture component have information about how it appears. A physics component has information about how it reacts with the physics system. A locomotion component allows for motion. An audio component has information about sounds it produces. An animation controller component controls animations. An effects component, a sprite or image panel component, a 3D text component, a timer component, whatever you need.
Sometimes components contain no data or code, they just serve as a marker. Usually you'll end up assigning some data to them eventually, so it works out to have them as full components. You might start with a simple marker component indicating something can be placed in inventories. (You may eventually add data like how much space it takes in the inventory, or if it is a player-only inventory or non-player inventory.)
This has a few potential drawbacks (especially when it comes to data locality) but with good engineering you can find ways that work for your system that minimize or avoid the issues you encounter.