Skip to content

Instantly share code, notes, and snippets.

@JakubDotPy
Last active November 5, 2021 18:08
Show Gist options
  • Save JakubDotPy/3a32d8e665e266580d05428dba56cf94 to your computer and use it in GitHub Desktop.
Save JakubDotPy/3a32d8e665e266580d05428dba56cf94 to your computer and use it in GitHub Desktop.
Instatiating an abstract class child using classmethod. Can't attach mandatory classmethod. Help needed.
def main():
kuba = Human(name='Kuba', character='x')
# this does not work
# TypeError: Can't instantiate abstract class Player with abstract methods choose_position
imported_player = Player.from_file('some_player')
players = [kuba, imported_player]
board = Board(size=20, empty_character='-')
tic_tac_toe = Game(players, board)
tic_tac_toe.print_intro()
tic_tac_toe.play()
tic_tac_toe.print_outro()
if __name__ == '__main__':
exit(main())
mport logging
from abc import ABC
from abc import abstractmethod
from importlib import import_module
log = logging.getLogger(__name__)
class Player(ABC):
def __init__(self, name, character):
self.name = name
self.character = character
@classmethod
def from_file(cls, filename):
try:
player_module = import_module(filename)
player = cls(
name=getattr(player_module, 'name'),
character=getattr(player_module, 'character'),
)
player.choose_position = getattr(player_module, 'choose_position')
except FileNotFoundError:
log.error(f'file {filename} does not exist')
raise
except ImportError:
log.error('error importing module')
raise
except TypeError:
log.error('cant create the player class')
raise
else:
return player
@abstractmethod
def choose_position(self, board):
pass
@property
def badge(self):
return f'{self.__class__.__name__} player {self.name}'
def __str__(self):
return self.name
class Human(Player):
def __init__(self, name, character):
super().__init__(name, character)
@staticmethod
def ask_for_position():
while True:
try:
pos = int(input('Enter the index where you want to play: '))
except ValueError:
print('Must be a number!')
else:
return pos
def choose_position(self, board):
return self.ask_for_position()
name = 'Testplayer'
character = 'x'
def ask_for_position():
while True:
try:
pos = int(input('Enter the index where you want to play: '))
except ValueError:
print('Must be a number!')
else:
return pos
def choose_position(board):
return ask_for_position()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment