Each object stores their creator (like in old tbgclient)

>>> session1 = Session("user1", "pass1")
>>> session2 = Session("user2", "pass2")
>>> msg1 = session1.get_message(1234)
>>> msg1
Message(mid=1234, ...)
>>> msg1.edit(subject="Edited 1")  # uses session1
>>> msg2 = session2.get_message(5678)
>>> msg2
Message(mid=5678, ...)
>>> msg2.edit(subject="Edited 2")  # uses session2
>>> # con: redundancy on data objects (they're supposed to only store data)

Each object requires a session as an input

>>> session1 = Session("user1", "pass1")
>>> session2 = Session("user2", "pass2")
>>> msg1 = session1.get_message(1234)
>>> msg1
Message(mid=1234, ...)
>>> msg1.edit(subject="Edited 1", session=session2)
>>> msg2 = session2.get_message(5678)
>>> msg2
Message(mid=5678, ...)
>>> msg2.edit(subject="Edited 2", session=session1)
>>> # con: redundancy on user code (have to specify which session to use)

Each object uses some default session

>>> session1 = Session("user1", "pass1")
>>> session2 = Session("user2", "pass2")
>>> session1.make_default()
>>> msg1 = session1.get_message(1234)
>>> msg1
Message(mid=1234, ...)
>>> msg1.edit(subject="Edited 1")  # uses session1
>>> msg2 = session2.get_message(5678)
>>> msg2
Message(mid=5678, ...)
>>> msg2.edit(subject="Edited 2")  # also uses session1
>>> # con: redundancy on method code (have to select the default session)

Which one should I choose?

comments

1 seems the best, since with the others you could pass, or make default, the wrong session. maybe you should be able to change, or remove (or make anonymous), the session in the object, in case you actually need to do this for whatever reason.