Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 6
1

Использование переменной между классами

08.06.2021, 16:10. Показов 2804. Ответов 11

Author24 — интернет-сервис помощи студентам
Здравствуйте. Такой вопрос. У меня есть переменная light в классе Randomize_light, которая используется в методе random_light. Данная переменная отвечает за генерацию рандомного числа для освещения, а метод уже реализует саму генерацию, не суть. У меня так же есть класс для генерации масок Maskss, там при генерации маски меняется цвет фона и цвет освещения, но чтобы вернуться к исходному освещению мне нужно задать параметр light из класса Randomize_light. Как это можно реализовать?

Фрагмент кода:
По нажатию кнопки "Генерировать освещение" у меня получается какой-то рандомный оттенок освещения, полученный переменной light из списка color_light. По нажатию кнопки Mask при определенном условии ( там так же есть галка, если стоит, то генерируется маска ( маска - некое изображение, с определенными параметрами освещения ), если нет, то будет обычное освещение ( параметры такого освещения записаны в переменную light ) ) у меня генерируется маска. Если я сгенерирую маску, а потом уберу галку и нажму еще раз сгенерировать, то освещение остается прежним, т.к. сохранился предыдущий параметр, мне же надо чтобы туда записывался параметр из переменной light.
После запуска программы по данному коду ошибок не возникает, ошибка возникает после нажатия кнопки Mask NameError: name 'light' is not defined, то есть не определена переменная light. Пробовал ее делать глобальной, может не правильно это сделал, пробовал через self как-то, может тоже не правильно сделал, в общем уже много чего попробовал чтобы эту переменную light = random.choice(color_list) из class Randomize_light(Operator): перетащить как переменную light в class Maskss(Operator):. Можешь ее как-то можно присвоить через новую переменную, например задать переменную light1 = light в классе Maskss, в общем нужна помощь.

[...] - пропущенный код, который не имеет значения. Так же тут естественно не весь код, только фрагмент, там весь код на много строк, надеюсь весь не нужно выкладывать. Если для решения задачи требуется весь код, я выложу весь.

Если где-то что-то не так в терминологии или вообще в коде даже, извиняюсь заранее, я в этом новичок, без ошибок тут никак, по всем вопросам критику принимаю)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class Randomize_light(Operator):
    bl_idname = 'object.random_light'
    bl_label = 'Генерировать освещение'
    light = None
   
    
    def structure4(self,context):
        props = context.scene.rand
        self.light = props.light
        self.scene = context.scene
    
    def get_selected_objects(self) -> List[Object]:
        return [ob for ob in self.scene.objects if ob.select_get()]
    
    
    def random_light(self, color_list, light):
        objects = self.get_selected_objects()
        self.color_list = [(0.642718, 0.847121, 1, 1),
                        (0.787, 0.912, 1, 1),
                        (0.219, 0.354, 0.465, 1),
                        (0.509, 0.569, 0.844, 1)]  
                      
      light = random.choice(color_list)
        bpy.data.materials["Material.001"].node_tree.nodes["Mix"].inputs[1].default_value = light
        
 
        
    def execute(self,context) -> set:
        self.structure4(context)
        self.random_light()
        return {'FINISHED'}
 
 
 
class Maskss(Operator):
    bl_idname = 'object.mask'
    bl_label = 'Mask'
        
        [...]    
 
    def masksss(self):
        objects = self.get_selected_objects()
                    
        for ob in objects:
            if  [.....]
            else:
                bpy.data.materials["Material"].node_tree.nodes["ColorRamp"].color_ramp.elements[0].color = (1, 1, 1, 1)
                bpy.data.materials["Material"].node_tree.nodes["ColorRamp"].color_ramp.elements[1].color = (1, 1, 1, 1)
                bpy.data.materials["Material.001"].node_tree.nodes["Light Falloff"].inputs[0].default_value = 500
                bpy.data.materials["Material.001"].node_tree.nodes["Mix"].inputs[1].default_value = light
                
    
    def execute(self,context) -> set:
        self.structure2(context)
        self.masksss()
        return{'FINISHED'}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2021, 16:10
Ответы с готовыми решениями:

Как передать значение переменной между классами?
Всем здравствуйте. Есть два файла со своими независимыми классами-формами. Одна форма стартовая,...

Передача функции между классами
Привет, столкнулся с трудностью, в гугле решения толкового не нашел. Есть 2 класса: class...

Использование Connection между классами
Здравствуйте! Под застрял на одном моменте. Загрузка драйвера и соединение с БД у меня...

Работа со значением переменной между классами
Всем желаю здравствовать! Помогите мне пожалуйста ответом на такой скорее всего глупый вопрос....

Использование ресурсов классами
В приложении есть кнопка и TextView. Пользователь жмёт клавишу. После нажатия клавиши я хочу,...

11
Автоматизируй это!
Эксперт Python
7196 / 4687 / 1222
Регистрация: 30.03.2015
Сообщений: 13,367
Записей в блоге: 29
08.06.2021, 16:21 2
mcratveller, ну так сделай лайт атрибутом и запрашивай его.

Добавлено через 1 минуту
Цитата Сообщение от mcratveller Посмотреть сообщение
Пробовал ее делать глобальной
не нужно. Просто добавь к ней self и попроси ее у объекта Рандомизе_лайт после выполнения нужных вычислений.

И подумай нельзя ли это вообще сделать отдельной независимой функцией?
0
0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 6
08.06.2021, 17:53  [ТС] 3
Цитата Сообщение от Welemir1 Посмотреть сообщение
Просто добавь к ней self и попроси ее у объекта Рандомизе_лайт после выполнения нужных вычислений.

А как обратиться к ней в коде программы потом в классе Maskss? Я просто пошарил в интернете все, я только учусь, попробовал некоторые варианты, не получилось.
0
Автоматизируй это!
Эксперт Python
7196 / 4687 / 1222
Регистрация: 30.03.2015
Сообщений: 13,367
Записей в блоге: 29
08.06.2021, 18:04 4
mcratveller, нужно было просто с книги начинать, а не шарить в интернете, тысячелетиями это работало.

вот пример
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
>>> class RandomizeLight:
...     def do_smth(self):
...         self.light = 100
... 
>>> class Masks:
...     def do_another(self):
...         randomize_light = RandomizeLight()
...         randomize_light.do_smth()
...         print(randomize_light.light)
... 
>>> masks = Masks()
>>> masks.do_another()
100
если создавать объект Рандом_лайт в маскс излишне или сложно, то пусть лайт в Рандом_лайт будет атрибутом класса.
0
0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 6
08.06.2021, 19:19  [ТС] 5
Цитата Сообщение от Welemir1 Посмотреть сообщение
если создавать объект Рандом_лайт в маскс излишне или сложно, то пусть лайт в Рандом_лайт будет атрибутом класса.
А, ну такое я пробовал да, это работает в случае такого кода:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Randomize_light():
     def random_light(self):
          color_list = [(0.642718, 0.847121, 1, 1),
                        (0.787, 0.912, 1, 1),
                        (0.219, 0.354, 0.465, 1),
                        (0.509, 0.569, 0.844, 1)]  
          self.light = random.choice(color_list)
          
 
class Masks():
     def masksss(self):
         randomize_light = Randomize_light()
         randomize_light.random_light()
         a = randomize_light.light
         print(a)
 
masks = Masks()
masks.masksss()
Но если я импортирую в эти классы еще класс Operator ( в скобках ), этот класс нужен, то есть такой вот код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Randomize_light(Operator):
     def random_light(self):
          color_list = [(0.642718, 0.847121, 1, 1),
                        (0.787, 0.912, 1, 1),
                        (0.219, 0.354, 0.465, 1),
                        (0.509, 0.569, 0.844, 1)]  
          self.light = random.choice(color_list)
          
 
class Masks(Operator):
     def masksss(self):
         randomize_light = Randomize_light()
         randomize_light.random_light()
         a = randomize_light.light
         print(a)
 
masks = Masks()
masks.masksss()
В этом случае возникает ошибка

Traceback (most recent call last):
File "D:\blender\test_nesk_def.blend\test_light.py", line 17, in <module>
masks = Masks()
TypeError: bpy_struct.__new__(type): expected a single argument


Да, значит я делал что Вы мне посоветовали, просто не получилось из-за этой ошибки. Не знаю что с этим делать, буду читать и смотреть дальше. В любом случае спасибо за отклик)
0
Автоматизируй это!
Эксперт Python
7196 / 4687 / 1222
Регистрация: 30.03.2015
Сообщений: 13,367
Записей в блоге: 29
08.06.2021, 19:32 6
Цитата Сообщение от mcratveller Посмотреть сообщение
masks = Masks()
TypeError: bpy_struct.__new__(type): expected a single argument
погоди! я то просто шаблончик тебе накидал, ты раньше то как создавал объект маскс?
0
0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 6
08.06.2021, 20:30  [ТС] 7
Цитата Сообщение от Welemir1 Посмотреть сообщение
ты раньше то как создавал объект маскс?
Я как переменную не объявлял ее нигде, просто написал как в шаблоне в конце, думал сработает, я думал только в Си надо писать мол int masks)
А как надо?
0
Автоматизируй это!
Эксперт Python
7196 / 4687 / 1222
Регистрация: 30.03.2015
Сообщений: 13,367
Записей в блоге: 29
09.06.2021, 06:37 8
Цитата Сообщение от Welemir1 Посмотреть сообщение
ты раньше то как создавал объект маскс?
ты же раньше как то работал с маскс? ты ж выше писал что в немт ебе надо использовать переменную, как ты его тогда раньше создавал, до моего кода? Работай с ним как и раньше, просто там где тебе нужен лайт создавай объект рендом_лайт и у него бери.

Цитата Сообщение от mcratveller Посмотреть сообщение
А как надо?
а надо все это оставить и пойти читать книгу
0
0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 6
09.06.2021, 17:48  [ТС] 9
Цитата Сообщение от Welemir1 Посмотреть сообщение
а надо все это оставить и пойти читать книгу
Какую книгу посоветуете?)
Мне просто ни с того, ни с сего понадобилось и очень срочно это сделать, я не думал даже, что пригодится, поэтому приходится все быстро изучать, впитывать и применять, это мой первый код на Python и второй вообще в программировании.

Цитата Сообщение от Welemir1 Посмотреть сообщение
ты же раньше как то работал с маскс? ты ж выше писал что в немт ебе надо использовать переменную, как ты его тогда раньше создавал, до моего кода? Работай с ним как и раньше, просто там где тебе нужен лайт создавай объект рендом_лайт и у него бери.
Я работал с функцией random_light(self), там у меня задана переменная light, сама функция находится в классе Randomize_light(Operator) и эту переменную ( даже не столько переменную, сколько именно значение этой переменной ) мне уже надо перенести в другой класс Maskss() в функцию masksss(self). Я на самом деле уже запутался, у меня нет никакой переменной masks, ранее я ее нигде не задавал, кроме как скопировал из шаблона и вставил в конце.
То есть у меня генерируется случайным образом значение переменной light и вот это сгенерированное значение нужно подставить в функцию masks в другом классе. Можно создать новую переменную и в него записать значение light, но по простому так не получается, там выдает другую ошибку.
0
Автоматизируй это!
Эксперт Python
7196 / 4687 / 1222
Регистрация: 30.03.2015
Сообщений: 13,367
Записей в блоге: 29
09.06.2021, 18:39 10
mcratveller, я ничего не понимаю. Ну совал ты свою функцию в какую то функцию класса Маскс и как ты ее вызывал? как это все работать то дожно было?
0
0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 6
10.06.2021, 01:21  [ТС] 11
Цитата Сообщение от Welemir1 Посмотреть сообщение
как это все работать то дожно было?
В данном случае у меня есть 2 кнопки "Генерировать освещение" ( bl_label в коде подписано ) и "Mask", если смотреть изначальный код что я скидывал. По нажатию кнопки 'Генерировать освещение' у меня генерируется освещение, генерация происходит в переменной:

Python
1
2
3
4
5
6
self.color_list = [(0.642718, 0.847121, 1, 1),
                        (0.787, 0.912, 1, 1),
                        (0.219, 0.354, 0.465, 1),
                        (0.509, 0.569, 0.844, 1)]  
                      
      light = random.choice(color_list)
Вот есть переменная light, она отвечает за сгенерированный набор чисел из списка выше.

Далее если я нажимаю кнопку "Mask" ( при этом галочка тоже должна стоять, на фото она показана ) у меня генерируется маска ( просто картинка с другим освещением ) и там я настроил чтобы освещение поменялось. Но если я убираю галочку и нажимаю эту кнопку еще раз, у меня освещение должно вернуться в исходное состояние до маски. За маски и свет отвечают 2 разных класса, вот мне значение переменной light из класса Random_light(Operator) надо перекинуть в класс Masksss(Operator).
Миниатюры
Использование переменной между классами  
0
1729 / 969 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
10.06.2021, 16:46 12
Цитата Сообщение от mcratveller Посмотреть сообщение
Но если я импортирую в эти классы еще класс Operator ( в скобках )
Неверное высказывание. Нельзя в классы импортировать класс. Можно указать какой класс является супер классом для данного класса, указывая имя суперкласса в скобках (Operator). Но это связь будет работать только в том случае, если суперкласс находится в том же модуле, что и данный класс. В противном случае нужно предварительно импортировать модуль, в котором находится суперкласс Operator.
Вообще трудно говорить о связях, когда нет полного кода и алгоритма, что он делает.

Добавлено через 21 минуту
Цитата Сообщение от mcratveller Посмотреть сообщение
Какую книгу посоветуете?)
Я раньше советовал Лутца "Изучаем Python".
Но во-первых это не для быстрого изучения,
а во-вторых, 4-ое издание уже устарело, а что бы читать 5-ое издание, нужно уже хорошо знать классы (и ООП в целом), так как для новичков, трудно воспринимаем.
Возможно это связано с корявым переводом на русский (перевод на русский, который я читал, 4-ого издания, был лучше).
Я не достаточно знаю английский, что бы читать в оригинале.
Лутц конечно замечательная книга, но для самостоятельного изучения новичком, она не под силу. По ней хорошо заниматься и достичь глубоких знаний Питона, но только если Вы изучаете ее под руководством куратора (профессионального программиста , хорошо знающего ООП), который разъясняет Вам все, что Вам по ходу изучения этой книги не понятно.
Краткий курс ООП, для быстрого его освоения, я думаю может дать только хороший репетитор.
Если же Вам просто нужен быстрый результат в написании кода, то выход только один, это фриланс.
Что касается изучения Питона и в частности ООП, может кто то здесь посоветует что то хорошее из литературы.
Я же по Питону ничего кроме Лутца не читал.

Добавлено через 37 минут
Цитата Сообщение от mcratveller Посмотреть сообщение
За маски и свет отвечают 2 разных класса, вот мне значение переменной light из класса Random_light(Operator)
Лично я такие задачи решаю создавая вместо глобальной переменной экземпляр light класса GV (сокращение от Global Variable).
Образец кода:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
class GV():        # класс "Глобальная переменная" (Global Variable)
    def __init__(self, v):
        self.v = v          # значение глобальной переменной
        self.sources = []   # список источников, изменяющих значение переменной,
                            # используется при отладке кода
    
# создаем необходимое количество экземпляров персональных глобальных переменных.
 
light = GV(0)
light.sources = [func, ]  # список источников (мест в коде, функции, модули и т.д.),
                           # изменяющих значение переменной,
                           # заполняется вручную при написании кода,
                           # используется при отладке кода
Добавлено через 7 минут
mcratveller, в такую квалифицированную переменную можно вносить изменения и читать из любого места программы.
А что бы избегать ошибок, которые могут возникать при использовании обычных глобальных переменных, нужно в атрибут sources , когда Вы пишете код, вручную заносить все те места, которые вносят изменение в значение данной переменной.
И учитывать этот список при отладке работы программы, что бы исключать возможные ошибки.

Добавлено через 5 минут
mcratveller, В Вашем случае, В в одном классе заносите значение в атрибут v такой переменной, а из другого класса читаете значение этого атрибута из этой переменной. Доступно в любом месте кода.

Добавлено через 4 минуты
Это в какой то степени тот же прием с атрибутом, который предложил Welemir1, но в таком виде делает его более универсальным, для использования в разных случаях.
0
10.06.2021, 16:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.06.2021, 16:46
Помогаю со студенческими работами здесь

Работа с классами (использование и применение классов)
Доброго времени суток, уважаемые форумчане! Возникла потребность редактировать файл настроек...

Использование одного элемента двумя классами
Здравствуйте! Есть основной класс с элементом WebBrowser - webBrowser1. Есть второй класс, в...

Сортировка списка с классами по переменной в классе
Есть класс, в классе переменная i; Есть лист с классами. Как отсортировать лист по величине i?

Использование имени метода/переменной, указанного в переменной String
public class Oll { String FishR = {&quot;R&quot;,&quot;U&quot;,&quot;Rb&quot;,&quot;U&quot;,&quot;R&quot;,&quot;U&quot;,&quot;U&quot;,&quot;Rb&quot;}; String FishL...

Запрет изменения переменной другими классами сборки
Есть некая переменная iV класса V. Как сделать так что бы другие классы сборки ее видели, а...

Использование переменной при урезании другой переменной
Есть следующий код: @echo off set a=#.......# echo %a% set /a b=5+1 set d=%a:~0,%b%% echo %d%...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru