Player assignment in Tic-Tac-Toe
When coming up with an OO design, always ask yourself "What is the responsibility of this class?" There should be only one. If you have to describe it with a bunch of ANDs, e.g. "it runs the game and prompts for player names and sets up the board and..." then it is a sign you may want to break it down further. This is called the Single Responsibility Principle. Resist the temptation to put all functionality into one class that does everything, as it is very easy to grow the class into the antipattern known as the God Object. Sometimes naming helps. If instead of TicTacToe, you called the object GameRunner (for example), you may be less tempted to put any and all Tic Tac Toe related things into it.

In your case, I'd try to keep TicTacToe as lean as possible. Prompting for a player's name should be something a Player object knows how to do, so I'd move that to the Player class. Also prompting for a mark can certainly be moved into the Player class. Possible interface:

marks = ["X", "O"] #this would be in the initialization
player1.mark = player1.select_mark(marks)
player2.mark = marks - player1.mark


Also, you'll want to create an object to represent the game board.