【问题标题】:Python: Multiple One-Argument ConstructorsPython:多个单参数构造函数
【发布时间】:2018-03-26 06:52:33
【问题描述】:

我有一个 Game 类,它的字段是 Board 对象。我目前通过传入有关游戏的字符串编码信息并制作Board 对象来制作Game

但是,我现在有一堆 Board 对象,并想创建一个直接接收 Board 对象的新构造函数。

这是我当前的构造函数:

def __init__(self, game_string):
    self.single_list = game_string.split(",")
    self.board = self.parse_game_string(game_string)
    self.directions = self.get_all_directions()
    self.red_number_of_streaks = self.get_number_of_streaks("R")
    self.black_number_of_streaks = self.get_number_of_streaks("B")

但是现在我有了 board 对象,所以我想这样做:

def __init__(self, board):
    self.board = board
    self.directions = self.get_all_directions()
    self.red_number_of_streaks = self.get_number_of_streaks("R")
    self.black_number_of_streaks = self.get_number_of_streaks("B")

我不认为 Python 会知道如何区分这两个构造函数。我可以根据参数的类型确定要做什么?比如:

如果是实例(str): # 常用的构造函数功能 elif isinstance(游戏): # 新的构造函数功能

有没有更好的办法?

谢谢!

【问题讨论】:

    标签: python


    【解决方案1】:

    我会这样做:

    class Game:
        def __init__(self, board):
            ...
    
        @classmethod
        def from_string(cls, game_string):
            board = cls.parse_game_string(game_string)
            game = cls(board)
            game.something = 5
    
            return game
    
        @staticmethod
        def parse_game_string(game_string):
            ...
    
            return Board(...)
    

    Game.from_string 然后将使用接受Board 对象的默认Game 初始化程序从字符串中构造Game 的实例。

    您必须将Game.parse_game_string 设为静态方法,才能在Game.from_string 类方法中使用它。

    【讨论】:

      【解决方案2】:

      查看输入的类型当然是一种选择:

      class Game(object):
          def __init__(self, str_or_board):
              if isinstance(str_or_board, Board):
                  board = str_or_board
              else:
                  board = self.parse_game_string(str_or_board)
      
              self.board = board
      

      除了isinstanceduck typing 也是一个选项。

      或者,您可以使用工厂函数:

      class Game(object):
          def __init__(self, board):
              assert isinstance(board, Board)
              self.board = board
      
          @classmethod
          def fromstring(cls, board_str):
              return cls(self.parse_game_string(board_str))
      
      # Use like ...
      game1 = Game(Board())
      game2 = Game.fromstring('foobar')
      

      【讨论】:

        【解决方案3】:

        对于 Python 中的方法重载,您可以将两个参数(game_stringboard)传递给 __init__,将它们初始化为 None。

        然后你可以有一个构造函数,例如:

        def __init__(self, game_string=None, board=None):
            self.single_list = game_string.split(",")
            self.board = self.parse_game_string(game_string) if game_string else board
            self.directions = self.get_all_directions()
            self.red_number_of_streaks = self.get_number_of_streaks("R")
            self.black_number_of_streaks = self.get_number_of_streaks("B")
        

        如果提供了game_string,它将用作板。否则,将使用 board 参数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-10-17
          • 2013-02-05
          • 2016-08-01
          • 2013-05-09
          • 2021-05-25
          • 2020-02-13
          • 2015-11-19
          • 2016-11-07
          相关资源
          最近更新 更多