Найти - Пользователи
Полная версия: Как значение переменной превратить в имя переменной?
Начало » Python для новичков » Как значение переменной превратить в имя переменной?
1
m1r42
Здравствуйте, уважаемые!
Есть у меня задача создать описание поля боя, по типу поля в игре Heroes III. Возможно я думаю в неправильном направлении, но именно для этого и пишу на форум чтобы найти приемлемый вариант.
Я представляю это как некий класс в котором будет описание границ каждого шестиугольника на поле. Из которого я смогу брать информацию о границах для последующего использования скажем как-то так:
 class battelfield(object):
    def __init__(self):
        self.a = (1,1,"b","f") # и так далее со всеми ячейками
        self.b = (1,2,"a","c")
Из чего видно что есть некая ячейка a которая расположена на поле с координатами 1,1 и граничит с ячейками b и f которые в свою очередь тоже граничат с другими ячейками.
Но в этом примере столкнулся с проблемой. Когда я хочу воспользоваться этими данными , скажем понять с какими ячейками граничит ячейка a я вызываю из класса переменную a и получаю ответ, что a граничит с b и f , но вот далее возникает проблема, я знаю название ячеек, но как теперь мне к ним обратиться? Ведь b и f - это не переменные, а значения.
Собственно вопрос в том, можно ли значение переменной превратить в имя переменной и далее использовать в своих целях? Либо я вообще не в том направлении копаю?
m1r42
Не знаю правильно ли это будет, но наверное разобрался как это сделать:
 locals().get("имя переменной")
py.user.next
m1r42
Есть у меня задача создать описание поля боя, по типу поля в игре Heroes III. Возможно я думаю в неправильном направлении, но именно для этого и пишу на форум чтобы найти приемлемый вариант.
Думаю, ты не сможешь пока что написать эту игру ни с классами, ни без классов, так как ты ещё слишком мало знаешь.

Классы в питоне нужны для того, чтобы писать реализацию, которая спроектирована в объектно-ориентированной парадигме программирования. Поэтому если ты даже можешь написать слово class в питоне, создать этот класс и даже создать экземпляр этого класса, от этого ты не будешь уметь работать с классами так, как это нужно делать. Поэтому все твои потуги закончатся ничем и ты запомнишь только то, как делать не надо. Это как изучить хорошо молоток и гвозди, а потом через стучание молотком пытаться построить дом. Мягко говоря, это просто не получится сделать, даже если ты сможешь забить пару гвоздей и даже правильно, а не согнув их.

Поэтому максимум, что ты можешь сделать, - это перейти в процедурную парадигму программирования и начать с процедурок, которые работают с глобальными данными.

Там развитие идёт так: сначала изучаешь процедурную парадигму программирования, потом изучаешь структурную парадигму программирования, потом изучаешь объектно-ориентированную парадигму программирования, после этого можно изучать функциональную парадигму программирования, а потом ещё остальные тоже изучить не помешает. Изучаешь их друг за другом.

m1r42
Как значение переменной превратить в имя переменной?
Есть функции setattr() и getattr(), ими можно формировать имя атрибута из строки.

  
>>> setattr
<built-in function setattr>
>>> getattr
<built-in function getattr>
>>> 
>>> getattr(1, 'bit_length')
<built-in method bit_length of int object at 0x7f706b3f3400>
>>> 
>>> getattr('a', 'upper')
<built-in method upper of str object at 0x7f706b4b6b58>
>>>
m1r42
Думал, что победил, но оказалось что locals() не содержит нужных мне переменных класса. Тупик.
m1r42

py.user.next
Думаю, ты не сможешь пока что написать эту игру ни с классами, ни без классов, так как ты ещё слишком мало знаешь.

Классы в питоне нужны для того, чтобы писать реализацию, которая спроектирована в объектно-ориентированной парадигме программирования. Поэтому если ты даже можешь написать слово class в питоне, создать этот класс и даже создать экземпляр этого класса, от этого ты не будешь уметь работать с классами так, как это нужно делать. Поэтому все твои потуги закончатся ничем и ты запомнишь только то, как делать не надо.

Поэтому максимум, что ты можешь сделать, - это перейти в процедурную парадигму программирования и начать с процедурок, которые работают с глобальными данными.

Там развитие идёт так: сначала изучаешь процедурную парадигму программирования, потом изучаешь структурную парадигму программирования, потом изучаешь объектно-ориентированную парадигму программирования, после этого можно изучать функциональную парадигму программирования, а потом ещё остальные тоже изучить не помешает. Изучаешь их друг за другом.
Не хочу вступать в дискуссию о моих возможностях. Думаю, форум существует совсем не для этого. За ответ по сути дела благодарю.
m1r42
py.user.next
Есть функции setattr() и getattr(), ими можно формировать имя атрибута из строки.
Спасибо огромное!
Работает:
 class battlefield(object):
    def __init__(self):
        self.a = (1,1,"b","f")
        self.b = (1,2,"a","c")
        
bt = battlefield()
print(getattr(bt, bt.a[2]))
m1r42
Первые результаты:
 class battlefield(object):
    def __init__(self):
        self.a = (1,1,"b")
        self.b = (1,2,"a","c")
        self.c = (1,3,"b","d")
        self.d = (1,4,"c","e")
        self.e = (1,5,"d")
class soldier(object):
    def __init__(self):
        self.attack = 1
        self.protection = 1
        self.power = 10
        self.position = ""
        self.speed = 2
bt = battlefield()
unit_first = soldier()
unit_first.position = "a"
unit_second = soldier()
unit_second.position = "e"
print("позиция первого юнита ",unit_first.position)
print("границы ячейки ", getattr(bt, unit_first.position))
print("позиция первого юнита ",unit_second.position)
print("границы ячейки ", getattr(bt, unit_second.position))
print("ходит первый юнит, скорость ", unit_first.speed)
for i in range(0,unit_first.speed):
    print ("ход ", i)
    unit_first.position = getattr(bt, unit_first.position)[2]
    print("позиция первого юнита ",unit_first.position)
    print("границы ячейки ", getattr(bt, unit_first.position))
В результате битвы первый юнит сделал попытку пойти в бой, но сразу же вернулся обратно. Решил, что сегодня битвы не будет. Ладно, главное что работает так как задумывалось.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB