Hangman game, written after taking a Python course
Your code structure is one of infinite recursion.  Main() calls placeholder(), which calls is_letter() which calls is_over() which calls is_letter() (recursive), or play_again() which calls Main() (recursive)!  Eventually, you will end up with a Stack Overflow if you play long enough!

What you want is a loop.  Two loops, actually.  Your program should be structured to operate something like:

play_again = True
while play_again:
    # initialize game state
    while not solved and guesses_left:
        # get guess
        # update game state
    play_again = ask_play_again()


No recursive calls are necessary.



You read all lines of the file to choose a random puzzle.  When you play again, you again read all lines in the file.  Perhaps you could read and store all the puzzles, and each time a game is played, you just select one randomly from the list.



Your placeholders are complicated, 3 character entities.  They could just be single characters, and spaces could be added during printing.

self.placeholder = [ "_" if ch != " " else " "  for ch in self.word ]


To print:

print("".join(f" {ch} " for ch in self.placeholder))


Or simply:

print("", "  ".join(self.placeholder))




You should allow for punctuation in the puzzles.  Like spaces, these should be directly shown, not converted to underscores.

 _  _  _  _  _  ’  _     _  _  _  _