2014-09-26 2 views
1

Я пытаюсь использовать переменную из класса - CustomNodeTranslator и иметь эту переменную для использования в другом классе - fileImporterИспользуя переменную из класса в другой класс

Однако я побудила с ошибкой # AttributeError: 'CustomNodeTranslator' object has no attribute 'camName' # я использовал аналогичный метод на другом 2-м классе, и он работает, за исключением двух классов.

Возможно ли, что CustomNodeTranslator - это особый случай? Видя, что он используется для плагина?

Пожалуйста, дайте мне советы.

Спасибо.

class CustomNodeTranslator(OpenMayaMPx.MPxFileTranslator): 
    def __init__(self): 
     OpenMayaMPx.MPxFileTranslator.__init__(self) 
    ... 
    ... 

    def reader(self, fileObject, optionString, accessMode): 
     try:   
      fullPath = fileObject.fullName() 

      self.fileHandle = open(fullPath,"r") 
      camHandle = self.fileHandle 

      camBaseName = os.path.basename(camHandle.name) 
      camName = os.path.splitext(camBaseName)[0] 
      self.camName = camName 

class fileImporter(): 
    def __init__(self, order): 

     test = CustomNodeTranslator() 

     cameraName, cameraShape = cmds.camera(n=str(test.camName)) 
     camSel.extend((cameraName, cameraShape)) 

     cmds.scale(0.5, 0.5, 0.5) 


     camBaseName = os.path.basename(camHandle.name) 
     camName = os.path.splitext(camBaseName)[0] 
     self.camName = camName 
+1

'test.camName' будет назначаться только после вызова' test.reader (...) ', поскольку он не назначен в' __init__'. – jonrsharpe

+0

@jonrsharpe Итак, я понимаю, невозможно вызвать какие-либо другие функции, если я не назначил его в '__init__'? – dissidia

+1

Непонятно, что вы просите. Любой случай, требующий двух атрибутов ('fileHandle' и' camName'), назначенных в первый раз в 'reader', завершится неудачно, если этот метод еще не был вызван. – jonrsharpe

ответ

1

Вы не создать атрибут класса в методе __init__, поэтому, конечно, --here--

test = CustomNodeTranslator() 
# -- here -- 
cameraName, cameraShape = cmds.camera(n=str(test.camName)) 

Это не видно. Либо назначьте его в init, либо поместите ссылку на атрибут в интерфейсе класса. More in the doc.

UPDATE: вы должны объявить его в классе CustomNodeTranslator

class CustomNodeTranslator(OpenMayaMPx.MPxFileTranslator): 
    def __init__(self): 
     self.camName = "" 
     .... 
+0

Привет, pardon my noobness, но что вы на самом деле имеете в виду? – dissidia

+0

'camName' становится« доступным »в' CustomNodeTranslator' только после его первого объявления. Поэтому после создания экземпляра ('CustomNodeTranslator() ') еще не имеет его. Только в первый раз, когда вы вызываете« читателя », у вас будет доступ к нему. Мое предложение было тогда объявить его, даже как' self.camName = "" ', в' __init__' метод –

+0

, поэтому я попытался объявить 'self.camName =" "' в любом из '__init__'. Я все еще получаю эту ошибку:' # AttributeError: type object 'CustomNodeTranslator' не имеет атрибута 'camName' # ' – dissidia

0

поле существует только после того, как вы его создали.

test = CustomNodeTranslator() 
# at this point test only has fields that are either introduced in 
# the __init__ 
# or in the class body (like methods) 
# calling reader with proper arguments will create the field 

test.reader(fileObject, optionString, accessMode) 
print test.camName 
+0

Кажется, что я даю мне больше таких проблем, как' # NameError: global name 'fileObject' не определен #, но в любом случае спасибо – dissidia

+0

@dissidia : Да, вы должны были определить их где-то раньше. – mkorpela

Смежные вопросы