【问题标题】:How to call attributes from outside classes?如何从外部类调用属性?
【发布时间】:2017-07-28 19:04:22
【问题描述】:

更新 2.0

目前已对其进行了更新,因此每个旧的“功能”都已移至我的班级下方。现在看来我唯一的问题之一就是弄清楚所有这些drawBoard() takes 1 positional argument but 2 were given

这只是我当前课程的开始,只是为了向您展示我目前正在处理的内容

【问题讨论】:

  • 你的代码有很多问题: 1. BoardHandler.__init__ 接受size 但不使用它。 2. BoardHandler.getNewBoard 返回board,我猜它应该把它写回给类成员。 3. 在resetBoard 中,您尝试访问BoardHandler().size,但是size 不是静态或类成员,因此它是特定于实例的。
  • @Johannes 观看更新版本!
  • 问题是我需要同时使用size的输入值和getNewBoardBoard,但是我已经被这个问题困扰了4个多小时,之后就出错了错误
  • 一个经常是TypeError: __init__() missing 2 required positional arguments: 'size' and 'board
  • 真正应该做的是创建类的resetBoarddrawBoard方法,然后他们可以使用self.board访问属性。否则,您需要修改它们以接受 BoardHandler 实例作为参数,例如命名为 board_handler,然后在其中使用 board_handler.board

标签: python


【解决方案1】:

更新依据:

程序的每次运行都会给出板子大小的选项 应该 ... 代码中的每块板都应具有相同的大小

我们将size 设为类变量,并且仅在尚未设置大小时提示输入大小。所有后续的电路板创建都将使用与第一个电路板相同的大小:

class BoardHandler:
    size = None

    def __init__(self):
        self.board = None

        if BoardHandler.size is None:
            self.ask_size()

        self.getNewBoard()

    def ask_size(self):  # no self use, method could be a function
        while True:
            try:
                BoardHandler.size = int(input("Which size would you want? "))
                break
            except ValueError:
                print("Wrong! try again")

    def getNewBoard(self):
        self.board = []

        for _ in range(BoardHandler.size):
            self.board.append([' '] * BoardHandler.size)

    def resetBoard(self):
        for x in range(BoardHandler.size):
            for y in range(BoardHandler.size):
                self.board[x][y] = ' '

        n = int(BoardHandler.size / 2 - 1)
        self.board[n][n] = 'B'
        self.board[n + 1][n] = 'W'
        self.board[n][n + 1] = 'W'
        self.board[n + 1][n + 1] = 'B'

    def drawBoard(self):
        HLINE = '   ' + '-' * (4 * BoardHandler.size) + '-'

        print(HLINE)

        for y in range(BoardHandler.size):
            print("{:2d}".format(y + 1), end=' ')
            for x in range(BoardHandler.size):
                print('| {}'.format(self.board[x][y]), end=' ')
            print('|')
            print(HLINE)

handler = BoardHandler()
handler.resetBoard()

handler.board[0][0] = 'W'

handler.drawBoard()

print(BoardHandler.size)

handler2 = BoardHandler()
handler2.drawBoard()  # empty board but same size as first

【讨论】:

  • @cdline 检查新更新,因为它主要基于您的帖子!
【解决方案2】:

正如我在评论中所说,我认为您应该在 BoardHandler 类的 methods 中创建这两个函数。这将为您提供更好的encapsulation,而且操作相当简单,方法如下:

class BoardHandler:
    def __init__ (self, size, board):
        self.size = size
        self.board = board

    def ask_size(self):
        try:
            self.size = int(input("Which size would you want?"))
        except ValueError:
            print("Wrong! try again")
            ask_size()

    def getNewBoard(self):
        board=[]
        for i in range(self.size):
            board.append([' ']* self.size)
        self.board = board

    def resetBoard(self):
        for x in range(self.size):
            for y in range(self.size):
                self.board[x][y] = ' '

        n=int(size/2-1)
        self.board[n][n] = 'B'
        self.board[n+1][n] = 'W'
        self.board[n][n+1] = 'W'
        self.board[n+1][n+1] = 'B'

    def drawBoard(self):
        HLINE = '  ----------------------------------------'

        for y in range(self.size):
            print(y+1, end=' ')
            for x in range(Q):
                print('| %s' % (self.board[x][y]), end=' ')
            print('|')
            print(HLINE)

如果您出于某种原因想要将它们保留在类之外,则需要修改它们中的每一个以接受 BoardHandler 类实例作为参数:

def resetBoard(board_handler):
    for x in range(board_handler.size):
        for y in range(board_handler.size):
            board_handler.board[x][y] = ' '

    n=int(board_handler.size/2-1)
    board[n][n] = 'B'
    board[n+1][n] = 'W'
    board[n][n+1] = 'W'
    board[n+1][n+1] = 'B'

def drawBoard(board_handler):
    HLINE = '  ----------------------------------------'

    for y in range(board_handler.size):
        print(y+1, end=' ')
        for x in range(Q):
            print('| %s' % (board_handler.board[x][y]), end=' ')
        print('|')
        print(HLINE)

这假定您的程序创建了一个 BoardHandler 类实例,并对那个对象执行所有操作。

【讨论】:

  • 我怎么能在课外打电话给他们?
  • 只使用BoardHandler().drawBoard() ?
  • 不,他们是班级的一部分。您的代码应该已经创建了一个 BoardHandler 实例。如果它存储在名为board_handler 的变量中,您可以根据需要调用board_handler.resetBoard()board_handler.drawBoard()
  • 好吧,我基本上应该board_handler = BoardHandler()
  • 然后使用board_handler.drawBoard()访问我的其余代码
猜你喜欢
  • 1970-01-01
  • 2015-06-09
  • 2014-08-10
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
相关资源
最近更新 更多