Итак, для контекста: я пытаюсь создать простую шахматную программу на питоне с помощью pygame (2.0.0). Поскольку я не хочу создавать каждую из 64 плиток вручную, я ищу способ создать их с помощью функции. Поскольку в шахматах плитки имеют имена от a1 до h8 (файлы и ранги), я хочу, чтобы объекты имели такие имена (a1, a2,...). Класс плитки до сих пор очень прост:
class tile:
def __init__(self):
self.piece = None
Тогда я сделал два списка: один для файлов и один для рангов. Затем два цикла for (один в другом), чтобы для каждой отдельной комбинации создавался тайл-объект:
files = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
ranks = ['1', '2', '3', '4', '5', '6', '7', '8']
for f in files:
for r in ranks:
f + r = tile()
Теперь моя проблема: python не позволяет этого ;( Я хочу создать 64 объекта плитки с именами от a1 до h8. Есть ли способ для этого?
Хотя это технически возможно, я бы настоятельно не советовал динамически манипулировать областями переменных. "Предполагаемый" способ сделать это - использовать словарь:
files = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
ranks = ['1', '2', '3', '4', '5', '6', '7', '8']
tiles = {}
for f in files:
for r in ranks:
tiles[f + r] = tile()
Затем вы можете получить доступ, например. плитка от E4 до tiles["e4"]
.
Было бы разумно хранить эти плитки в dict
:
files = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
ranks = ['1', '2', '3', '4', '5', '6', '7', '8']
tiles = {f'{file}{rank}': tile() for file in files for rank in ranks}
Другой способ — создать класс Chessboard
:
class Chessboard:
def __init__(self, files, ranks):
for file in files:
for rank in ranks:
setattr(self, f'{file}{rank}', tile())
chessboard = Chessboard(files, ranks)
Ну, он делает то, что следует из его названия. Он устанавливает атрибуты. В этом случае атрибуты класса Chessboard
от имен f'{file}{rank}'
к значениям tile()
.
означает ли это, что f'{file}{rank}' становится объектом класса тайлов? если да, то как это возможно внутри такого объекта, как шахматная доска? Доступен ли новый объект только в классе шахматной доски? А что делает f''?
Я бы порекомендовал вам просто попробовать и посмотреть, что произойдет. Это лучший способ понять материал. Кроме того, если есть общие понятия, с которыми вы не знакомы или не понимаете, просто найдите их. Это легко сделать, и вы найдете гораздо лучшие и более подробные объяснения.
Не могли бы вы объяснить, как работает вторая часть? Я не понимаю, как setattr() работает с (self, '{file}{rank}', tile()). Также: что делает '{file}{rank}'?