2013-04-09 1 views
0

최근 상속에 관한 질문을 올렸지 만 정답을 얻지 못해 다시 시도하고 있습니다.Python 상속 init에서만 작동

여기이 코드가 있습니다

import maya.cmds as cmds 
import jtAutoRigUI 

class RigLegs(jtAutoRigUI.RigUI): 
    def __init__(self, *args): 
     jtAutoRigUI.RigUI.__init__(self) 
     self.rigLegs() 

    def rigLegs(self): 
     self.items["side"] = "left" 
     self.lIK = cmds.duplicate(self.lJoints["hip"], n = self.getName("hip_IK")) 
     self.lIK = cmds.listRelatives(self.lIK, ad = True, type = "joint") 
     for i in self.lIK: 
      newName = i.replace("_JNT", "_IK") 
      cmds.rename(i, newName) 

을 그리고는 init 메소드에서 선언 있기 때문에 그 self.items["side"] = "left" 작동합니다. 그러나 init 메소드 밖에서 선언 된 것은 상속에 의해 선택되지 않습니다. 그래서 자기가 될 때. 조인트는 실수를 저지른다.

class RigUI(object): 
    def __init__(self): 
     self.widgets = {} 
     self.items = {} 
     self.items["side"] = "center" 
     self.interface() 
+3

'자가.ljoints' * and *'self.loint [ "hip"]'는 self.rigLegs()를 호출하기 전에 초기화 되었습니까? 파이썬의 값은 기본값으로 존재하지 않습니다. 그것들은 초기화되어야합니다. 그렇지 않으면'NameError' /'AttributeError' /'KeyError'를받을 수 있습니다. (당신이 여기에있는 것을 알면 도움이 될 것입니다.) – cdhowie

+0

?? 나는 네가하는 말을 정말로 모른다. 물론 self.loints [ "hip"]이 있었고, 그렇지 않으면 나는 그것을 사용하려고하지 않을 것입니다. – Vii

+2

"init 메소드 외부에서 선언"이란 무엇을 의미합니까? 일반적으로 변수는 Python에서 선언되지 않습니다. 방금 변수를 설정하면 변수가 존재합니다. – abarnert

답변

2

당신이 시작 오류는이 라인에 lJoints에 명백하게 AttributeError이었다

self.lIK = cmds.duplicate(self.lJoints["hip"], n = self.getName("hip_IK")) 

이의 당신이 만든 어떤 막연하게 설명 변경에서 이후 오류 잊고이 문제를 해결하자.

에는 lJoints이라는 속성이 없지만 어떤 식 으로든 self.lJoints을 수정하려고한다는 오류가 표시됩니다. 특히 __getitem__ 메서드를 호출하고 있지만 여기서는 그다지 중요하지 않습니다.

이렇게 초기화 된 방법을 알기에 충분한 코드를 표시 했으므로 이유는 분명합니다. 이 함수를 호출하기 전에 self.lJoints을 초기화하십시오. 그것을 통해

하자 추적 : RigUI.__init__()이 수행 지금

jtAutoRigUI.RigUI.__init__(self) 

:

먼저, RigJoint.__init__()이 않는 interface 방법은 lJoints을 설정하지 않는 한

self.widgets = {} 
self.items = {} 
self.items["side"] = "center" 
self.interface() 

, 그것은 아직 설정되지 않은 것 이 지점에서. 하지

그래서

, 그 함수가 반환, 우리는 다시 RigJoint.__init__()에있어이 :

self.rigLegs() 

그래서, 지금 우리는 RigJoint.rigLegs()로 이동합니다

self.items["side"] = "left" 

self.lJoints를 설정하지 않는 .

self.lIK = cmds.duplicate(self.lJoints["hip"], n = self.getName("hip_IK")) 

그리고 존재하지 않는 self.lJoints을 사용하려고합니다. 따라서 AttributeError. 이 오류를 얻을 이유를 이해하지 않는 경우


, (물건을 디버깅 할 때 항상 좋은 단계) 별도의 라인에 아래를 나눈 :

lJoints = self.lJoints 
hip = self.lJoints["hip"] 
name = self.getName("hip_IK") 
dup = cmds.duplicate(hip, name) 
self.lIK = dup 

지금 당신이 문을 얻는다 확인할 수 있습니다 예외이며, 최초의 것입니다. 원래의 복잡한 명령문보다 디버그하기가 훨씬 쉬워야합니다.

+0

ljoints는 원본 파일의 나중 정의에 설정되어 있지만 게시하기에는 너무 큽니다. 내가 붙여 넣을 수 있다고 가정합니다. http://pastebin.com/XBZcX3Fd 그걸 살펴보고 더 이상 이해가가는 지 확인하십시오. 도와 주셔서 감사합니다. – Vii

+0

@ user1090427 : 좋습니다. 그래서'makeSkeletonLegs'라는 어떤 메소드는'self.lJoints = {}'를 설정합니다. 그러나 당신이'rigLegs()'를 호출 할 때 아직'makeSkeletonLegs() '를 호출 한 사람이 없다. 사용자가 "Generate Skeleton"버튼을 클릭 할 때까지 호출되지 않는 것처럼 보입니다.이 버튼은 객체 및 버튼 등을 만들 때 분명히 발생하지 않았습니다. – abarnert

+0

rigLegs()를 호출하기 전에 Generate Skeleton을 클릭해야합니다. Generate Skeleton이 다음 버튼을 활성화하기 때문에 불가능합니다. 요점은 궁극적으로 모든 것이 부름 받았습니다! – Vii