Last active
November 5, 2021 18:08
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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