Можно ли вызывать метод, который использует переменные из другого метода в классе? - PullRequest
1 голос
/ 07 января 2020

Я пишу скрипт в Maya и пытаюсь назначить переменную внутри другого метода, а не внутри __init__, как мы обычно делаем (я помещаю свои оконные команды в __init__, поэтому, когда инициализируется новый экземпляр, если мы присваиваем переменные внутри __init__, он будет работать до конца, не назначая переменным значение, которое я хочу). Например:

    def __init__(self, windowID = 'selectsomething', title = 'select something'):
        self.windowID = windowID
        self.title = title

        if cmds.window(self.windowID, exists = True):
            cmds.deleteUI(self.windowID)

        myWindow = cmds.window(self.windowID, title = self.title)
        cmds.rowColumnLayout(numberOfColumns = 2, columnWidth = [(1, 300), (2, 100)],
                             columnAttach = [1, 'left', 10], columnSpacing = [1, 10],
                             rowSpacing = [1, 5])
        cmds.button(label = "Apply", command = self.applyButton) #it should print out selected object
        cmds.button(label = "Cancel", command = self.cancelButton)
        cmds.showWindow(myWindow)

        #now for example if I have a sel variable to store selected objects, it would actually return nothing cuz the code ran all the way through and didnt wait for me to select what I needed
        sel = cmds.ls(selection = True) #this will return nothing

Таким образом, мое решение состояло в том, чтобы назначить переменные внутри метода applyButton, который будет хранить то, что я выбрал, как я хочу, но я обнаружил, что немного странно вызывать метод, который использует переменную из другого метода из самого этого метода. Например:

class Abc:
    def func(*arg):
        print(self.var)

    def var(self):
        self.var = 1
        self.func()

abc = Abc()
abc.var()

Пока код работает нормально, но звучит немного странно, вызывая метод func, который использует переменную из метода var из самого метода var ? Я не видел, чтобы кто-нибудь делал это раньше. Я имею в виду без класса, переменная, назначенная внутри функции, остается внутри этой функции, и мы можем использовать ее только с return. Но, похоже, в классе мы можем сделать любую глобальную переменную внутри метода, добавив перед ней self.? 1016 *

Мой друг также сказал, что в этом случае мы можем использовать @property, но я не думаю, что разобрался еще. У кого-нибудь есть идеи?

Большое вам спасибо, ребята, и счастливого Нового года, ребята !!!

1 Ответ

1 голос
/ 07 января 2020

Вы должны знать, что атрибуты данных неявно являются членами класса и поэтому могут использоваться любым методом в том же классе после того, как они были назначены где-то.

Из документации Python :

Атрибуты данных не должны быть объявлены; подобно локальным переменным, они возникают при первом назначении.

Хотя ваш пример будет работать (если вы вызовете Abc.var() до Abc.func()), ИМХО будет лучше стиль для инициализации переменная на уровне класса (обратите внимание, что я называю ее val, чтобы избежать путаницы с именем метода):

class Abc:
    val = 0

    def func(self, *arg):
        print(self.val)

    def var(self):
        self.val = 1
        self.func()

Цель ключевого слова self здесь хорошо объяснена здесь и здесь .

Также обратите внимание, что инициализация атрибута внутри метода __init__ свяжет этот атрибут с экземпляром класса, в то время как инициализация его вне метода __init__ свяжет его с самим классом, что совсем другое (см. это обсуждение ).

...