Форум сайта python.su
0
Набросал простой пример проблемы. Есть класс созданныя для выбора и сравнения значений цветов из массивов(Менять класс нельзя). Некоторые значения хранятся не в массивах, а в переменных (Менять нельзя).
После того как значения выбраны, необходимо произвести проверку, и если среди значений есть ‘blank’, то есть “пустой” цвет, переопределять остальные значения цветов на ‘blank’.
import random
#Данные
colors_one = [('brown', 1), ('black', 1), ('green',1),
('blue', 0), ('gray', 0), ('blank', 1)]
colors_two = [('white', 0), ('black', 2), ('gray', 3),
('green', 1), ('yellow', 0), ('red', 1),
('blank', 0)]
class define_color:
#Выбирает два случайных цвета из массива, сравнивает их
#индексы и присваивает переменной main_color тот
#признак у которого индекс выше.
def __init__(self, seq):
#Описываем переменные
self.sequence = seq
self.choice_one = random.choice(self.sequence)
self.choice_two = random.choice(self.sequence)
self.main_color = 'N/A'
#Сравниваем
if self.choice_one[1] > self.choice_two[1]:
self.main_color = self.choice_one[0]
if self.choice_one[1] < self.choice_two[1]:
self.main_color = self.choice_two[0]
if self.choice_one[1] == self.choice_two[1]:
self.main_color = self.choice_one[0]
#Создаем несколько экземпляров класса для тестирования
color_one = define_color(colors_one)
color_two = define_color(colors_two)
#Поскольку некоторые значения хранятся не как атрибут класса
#а как обычные переменные, создаем обычные переменные
color_three = "N/A"
color_four = "blank"
#Выводим отладочную информацию
#До переопределния
print("Unchanged values")
print("color one", color_one.main_color)
print("color two", color_two.main_color)
print("color three", color_three)
print("color four", color_four)
#Начинаем проверку на вхождение "blank"
#Создаем массив куда помещаем значения переменных и атрибутов класса
color_list = [color_one.main_color, color_two.main_color,
color_three, color_four]
#Cчетчик для цикла
col_counter = len(color_list) - 1
#Перебираем значения хранящиеся в массиве и если видим хоть один пустой цвет
#переопределяем остальные цвета на пустой (blank).
if "blank" in color_list:
while col_counter != 0:
color_list[col_counter] = "blank"
col_counter = col_counter - 1
#Просто разделитель
print('-----------------------------------')
#Выводим отладочную информацию
#После переопределния
print("Changed values")
print("color one", color_one.main_color)
print("color two", color_two.main_color)
print("color three", color_three)
print("color four", color_four)
if "blank" in color_list:
color_one.main_color = 'blank'
color_two.main_color = 'blank'
color_three = 'blank'
color_four = 'blank'
Отредактировано rudm (Дек. 1, 2013 14:06:12)
Офлайн
7
Есть такая штука - слоты (__slots__), покопайте в эту сторону
хотя… тут наверное лучше через словарь сделать и всё…
Отредактировано Master_Sergius (Дек. 1, 2013 15:08:42)
Офлайн
857
rudmпридётся сделать функцию, которая меняет всё: глобальные переменные устанавливает и у объектов вызывает метод изменения атрибутов
После того как значения выбраны, необходимо произвести проверку, и если среди значений есть ‘blank’, то есть “пустой” цвет, переопределять остальные значения цветов на ‘blank’.
rudmпридётся добавить метод, который делает изменение всех атрибутов (объект сам должен знать, какие у него атрибуты внутри)
Менять класс нельзя
rudmпеременных может быть не только много, но и имена у них могут меняться
Ведь переменных может быть не четыре, а четыре сотни к примеру.
rudmсначала избавиться от глобальных переменных
Но может быть есть более правильное решение?
rudm
Очень полезна была бы функция, которая позволяет получить порядковый номер элемента массива, по его значению.
help(list) help(list.index)
Офлайн