Class2 ist meine Haupt-APP, die Liste der Schaltflächen aus favList anzeigt. In der displayLibrary erstelle ich Button mit Class1 Instance. Wenn Benutzer klicken Sie auf eine Schaltfläche (simulateButtonClick), ich musste doppelte Funktion von Class1 Dort führen ich werde alle erforderlichen Sachen zu duplizieren Objekt in Maya, und ich möchte dieses Material mit Class2.addSlot Funktion hinzufügen (weil ich viel bekam . von dort überprüft und keine unnötigen Code wollen)Daten übertragen und defs zwischen Klassen ohne Instanzen verwenden - möglicherweise Singleton Pattern
So ist der Deal, diese Verbindungen zu schaffen: 1. Class2.displayLibrary -> erstellen Tasten mit Instanz von Class1 2. Wenn Class2.simulateButtonClick verwendet -> goto Class1.duplicateNetwork -> goto Class2.addSlot Und die zweite bin ich die härteste, denn wenn ich von Button DuplicateNetwork aufrufen, rufe ich die Instanz, die ich erstellt habe, und es ist in Ordnung. aber wenn ich zu Class2.addSlot zurückkehren möchte, kann ich keine Instanz erstellen. Ich muss die einzige verwenden, die ich am Anfang verwende. Deshalb versuche ich Singleton zu verwenden.
Ich habe diese 2 Zeilen kommentiert, die Fehler verursachen.
favList = []
buttons = {}
favList.append("shader1")
favList.append("shader2")
favList.append("shader3")
favList.append("shader4")
class Singleton(object):
_instances = {}
def __new__(class_, *args, **kwargs):
if class_ not in class_._instances:
class_._instances[class_] = super(Singleton, class_).__new__(class_, *args, **kwargs)
else:
# class_._instances[class_].__init__(class_, *args, **kwargs)
class_._instances[class_].__init__(*args, **kwargs)
return class_._instances[class_]
class Class1(Singleton):
def __init__(self, name):
print ("Just test if name is working: {0}").format(name)
@staticmethod
def duplicateNetwork(self):
newMaterial = "shader8000"
Class2.addSlot(newMaterial)
class Class2(Singleton):
def __init__(self):
print "Do something in Class2"
self.displayLibrary()
self.simulateButtonClick()
def addSlot(self, shaderName=None):
favList.append(shaderName)
self.displayLibrary()
def displayLibrary(self):
for i,obj in enumerate(favList):
# create button with Class1 Instance
buttons[i] = Class1(obj)
print("Shader library contains: {0}").format(obj)
def simulateButtonClick(self):
material = "Shader6000"
# Simulate click for button "Shader1"
buttons[0].duplicateNetwork(self)
run = Class2()
Jetzt habe ich Fehler: Tasten [i] = Class1 (obj)
Traceback (most recent call last):
File "G:\kTools\singlethon.py", line 46, in <module>
run = Class2()
File "G:\kTools\singlethon.py", line 27, in __init__
self.displayLibrary()
File "G:\kTools\singlethon.py", line 38, in displayLibrary
buttons[i] = Class1(obj)
File "G:\kTools\singlethon.py", line 13, in __new__
class_._instances[class_].__init__(class_, *args, **kwargs)
TypeError: __init__() takes exactly 2 arguments (3 given)
Das ist, weil ich in Singleton in anderen Wenn class_ wurde. Ich habe auch diese Zeile kommentiert, aber könnten Sie mir sagen, warum? Ich weiß nicht, warum es notwendig ist, * args ** kwargs zu sein, ich weiß meistens, was sie sind, aber keine Idee, warum ich sie in Singleton brauche.
Zweiter Fehler:
Traceback (most recent call last):
File "G:\kTools\singlethon.py", line 49, in <module>
run = Class2()
File "G:\kTools\singlethon.py", line 31, in __init__
self.simulateButtonClick()
File "G:\kTools\singlethon.py", line 46, in simulateButtonClick
buttons[0].duplicateNetwork(self)
File "G:\kTools\singlethon.py", line 25, in duplicateNetwork
Class2.addSlot(newMaterial)
TypeError: unbound method addSlot() must be called with Class2 instance as first argument (got str instance instead)
Und für diese, ich habe Problem von Anfang an. Keine Ahnung, wie man es löst.
Sie ein komplettes Arbeitsbeispiel liefern können, so können wir leicht sehen, was falsch ist? Wenn Sie Ihren Code mit 'favouriteMaterial_UI.addSlot (shader)' kommentiert, gibt es keinen Fehler bei der Ausführung von 'RightClickMenuButton()' ... Auch, welche Version von Python benutzen Sie? – Silmathoron
Sicher ist dies meine vollständige Codeskizze. http://pastebin.com/4rPv3xDG und QTutils zu importieren http: // Pastebin.com/ANUVkX1D Sie können es in Autodesk Maya ausführen – user2455219
Viele Dinge zu kommentieren, um Ihren Code auf meinem Laptop laufen zu lassen gibt keinen Fehler beim Erstellen 'favouriteMaterial_UI' ... Sie änderten auch' __call__' zu '__new__', was macht mehr Sinn für mich. Bitte versuchen Sie ein ** wirkliches ** minimal funktionierendes Beispiel ohne unnötige Bibliothek (wie Maya, Shiboken, etc.) auszuarbeiten, die immer noch den Fehler anzeigt, der Sie beunruhigt, so dass jeder den gleichen Code ausführt. Bearbeiten Sie Ihren Beitrag, um den alten Code zu ersetzen. – Silmathoron