如何递归地创建可单独访问的对象

2024-06-25 23:18:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python的新手,缺乏正规的培训。我所学到的一切都是通过书本和我看过的一些视频学到的。所以,虽然我了解一些基本概念,但对于许多优秀的程序员可能认为理所当然的事情,我仍然有困难。所以我需要帮助。在

我在做一个象棋程序,在创建棋子的时候,我想知道如何用一个功能创建所有的棋子,但以后可以单独访问它们来改变它们各自的位置。我不能像我希望的那样把字符串变成变量。在

class Name(object):
    def __init__(self, posx, posy, posz):
        self.pos= (posz, posy, posz)
        box(pos=self.pos)

然后我就可以从列表中创建一个包含位置的簇,但仍然可以将它们作为单独的对象进行访问。在


Tags: 字符串posself程序功能视频事情class
2条回答

您希望如何访问它们?如果你想用字符串键访问它们,那么最简单的方法就是把它们放在dict中,但是我不确定这是你真正想要做的。更常见的做法是把它们列在一个列表中。在

一种让你自己更轻松的方法是不必担心棋子在哪里,而是将其委托给一个棋盘对象:

import string

class Piece(object):
    def __init__(self, type, colour):
        self.type = type
        self.colour = colour
    def __str__(self):
        return 'Piece(%(type)s, %(colour)s)' % self.__dict__

class Board(dict):
    def __init__(self, width, height):
        self.update(
            dict(((x,y), None) 
                for x in string.ascii_lowercase[:width] # alphabetic axis 
                for y in xrange(1, height+1)            # numeric axis
            )
        )

    def setup(self, position_seq):
        for type, colour, position in position_seq:
            self[position] = Piece(type, colour)

initial_positions = [
    ('rook', 'W', ('a', 1)),
    ('knight', 'W', ('b', 1)),
    ('bishop', 'W', ('c', 1)),
    ('queen', 'W', ('d', 1)),
    ('king', 'W', ('e', 1)),
    ('pawn', 'W', ('a', 2)),
]

b = Board( 8,8 )
b.setup( initial_positions )
print b['a',1] # returns Piece(rook, W)

Board的setup方法接受一个元组列表,每个元组都包含实例化一个新片段所需的数据,并指定它应该在线路板上的位置。不需要递归,只需要简单的循环将数据传递到类中。在

相关问题 更多 >