2017-03-08 12 views
0

Ich habe zwei Dateien, die die gleiche Objekt-Tracking-Methode aus einer dritten Datei importieren. Es funktioniert so etwasMaya Python: Unbound-Methode wegen Reload()

file TrackingMethod 

    class Tracker(object): 
     def __init__(self,nodeName=None,dag=None,obj=None): 
      #Does some open maya stuff to get the dag path 
     def fullpath(self): 
      return dag.fullpath() 

file Shapes #classes that create objects with shape nodes 
    import TrackingMethod as trm 
    reload(trm) 

    class circle(trm.Tracker): 
     def __init__(self,nodeName=None,dag=None,obj-None): 
      #does some shape related stuff then inits tracker 
      trm.Tracker.__init__(self,nodeName=nodeName,dag=dag,obj=obj) 

file ShaderNodes #Classes that create shading nodes 
    import TrackingMethod as trm 
    reload(trm) 

    class shaderThingy(trm.Tracker): 
     def __init__(self,nodeName=None,dag=None,obj-None): 
      #does some shader related stuff then inits tracker 
      trm.Tracker.__init__(self,nodeName=nodeName,dag=dag,obj=obj) 

Hier ist das Problem. Der Fehler tritt beim trm.Tracker auf. init. Wenn ich beide Dateien verwende und zufällig ShaderNode oder Shapes neu lade(), erkennen die Methoden des anderen nicht mehr, dass es sich um Unterklassen der ursprünglichen TrackingMethod-Klasse handelt. Durch das Nachladen verliert die andere Klasse ist es Referenz und ich entweder:

>>unbound method __init__() must be called with Tracker instance as first argument (got circle instance instead) 

oder

>>unbound method __init__() must be called with Tracker instance as first argument (got ShaderThingy instance instead) 

..depending, auf dem neu geladen wird. Der letzte, der neu geladen wird, funktioniert und der zuvor neu geladene wird ungebunden.

Wohlgemerkt, ich muss diese Skripte neu laden, um meine Änderungen zu testen. Ich weiß, sobald die Reloads nicht mehr da sind, sind sie nicht mehr ungebunden, aber ich muss meine Änderungen sehen, wenn ich arbeite.

Was mache ich?

+0

Ich weiß, diese Frage ist sehr ähnlich zu einer früheren Methode nicht gebunden Frage, die ich hatte, aber die Super-Lösung hat nicht konsistent mit dem vorherigen Beispiel funktioniert, und ich denke, wissen warum jetzt. Ich habe das Problem auf die Verwendung von Nachladen beschränkt. Die Frage, denke ich, ist, ob es eine kluge Möglichkeit gibt, Ihre Skripte neu zu laden, damit andere Dateien, die dieselbe Quelldatei verwenden, nicht beschädigt werden. –

Antwort

0

Sie können TrackingMethods zweimal mit zwei Namen importieren.

In Formen:

import TrackingMethods as trm_shapes 


class shape(trm_shapes.Tracker) ... 

Und in Shadern:

import TrackingMethods as trm_shaders 

class shader(trm_shaders.Tracker) ... 

Dies sollte funktionieren, solange niemand, ob eine Shader oder Form Objekte die Instanz eines Tracker sind zu überprüfen außen versucht - es wird scheitern.

+0

Ich habe es gerade versucht, und es funktioniert nicht. Für das Leben von mir kann ich nicht herausfinden, warum, aber ich bekomme immer noch die ungebundene Methode .. trotz seiner eigenen lokalen Import. Aus irgendeinem seltsamen Grund funktioniert es manchmal, wenn es in der magischen richtigen Reihenfolge geladen wird, aber nicht das andere. Manchmal erkennt es, dass es ein Tracker-Objekt ist und manchmal sieht es nur die letzte Klasse, Kreis. Frustrierend. –

0

Sie wollen wahrscheinlich die Nachladen von Ihrem Submodule und laden sie in der logischen Reihenfolge durch die Abhängigkeiten in den Dateien implizit entfernen:

reload(TrackingMethod) 
reload(Shapes) 
reload(ShaderNodes) 

Für einen kleinen Fall wie diesem es funktioniert, aber wenn die Dinge mehr komplex wird es schwer zu verwalten sein.

+0

Ich denke, ich bin in der schwer zu managenden Bühne. Jedes Mal, wenn ich eine neue Registerkarte oder einen Aspekt anlege, wo ich eine neue Datei haben möchte, muss ich diese Nachverfolgungsmodule laden, und dass ich sie überlade, denke ich. 5 verschiedene Dateien sind jetzt, warum es bricht. Es fühlt sich an, als gäbe es hier keine Lösung, und ich muss nur das ganze Tracking neu schreiben, um nicht __init__ zu verwenden oder eine riesige Tracking-Datei mit 5k Zeilen Code zu erstellen. Das ist sehr frustrierend. –