Class2, favList düğmelerinin listesini gösteren ana uygulamamdır. GöstergedeLibrary Class1 Instance ile düğme oluşturuyorum. Kullanıcı bir düğmeyi tıklattığında (simulateButtonClick), Class1 'dan duplicateNetwork işlevini çalıştırmam gerekiyordu. Maya'da nesneyi çoğaltmak için gereken tüm şeyleri yapacağız ve bu malzemeyi Class2.addSlot işlevini kullanarak eklemek istiyorum (çünkü çok fazla aldımVerileri iletme ve örnek olmayan sınıflar arasındaki def'leri kullanma - muhtemelen Singleton Pattern
yüzden anlaşma bu bağlantıları oluşturmaktır orada kontrol ve gereksiz kod istemiyorum) tarihi. - Class2.simulateButtonClick kullanıldığında> Class1 2. örneği ile düğmeler oluşturmak - Class2.displayLibrary itibaren 1.> git Class1.duplicateNetwork -> goto Class2.addSlot Ve ikincisi en zor olanı, çünkü butondan duplicateNetwork çağıracağım zaman, daha önce oluşturduğum örneği ve onun güzelini arıyorum. ama Class2.addSlot'a geri dönmek istediğimde örnek oluşturamıyorum. Kullanmakta olduğum tek şeyi kullanmam gerek. neden bu yüzden Singleton kullanmaya çalışıyorum.
Hatalara neden olan 2 satırı yorumladım.
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()
Şimdi hataları var: düğmeleri [i] = Sınıf1 (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)
Thats olarak tekil Başka Eğer içinde class_ var çünkü. Bu çizgiyi de söyledim, ama nedenini söyleyebilir misin? Neden * args ** kwargs olması gerektiğini bilmiyorum, çoğunlukla ne olduklarını biliyorum, ama hiçbir fikrin neden Singleton'a ihtiyacım var.
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)
Ve bunun için, ben baştan sorun var:
İkinci hatadır. Bunu nasıl çözeceğine dair bir fikrim yok.
Eğer tam bir çalışma örneği yüzden daha kolay neyin yanlış olduğunu görebilirsiniz verebilir misiniz: trick (muhtemelen
Singleton
gerekmez) yapmalıdır? Kodunuzu 'favoriteMaterial_UI.addSlot (shader)' ile kullanmak, 'RightClickMenuButton() '... 'u çalıştırırken bana hata veriyor, python'un hangi sürümünü kullanıyorsunuz? – SilmathoronTabii ki bu benim tam kod taslağım. http: // pastebin dosyasını içe aktarmak için http://pastebin.com/4rPv3xDG ve QTutils.com/ANUVkX1D Autodesk Maya – user2455219
'da çalıştırabilirsiniz Kodunuzun dizüstü bilgisayarımda çalışması için bir çok şey yorumlamak, "favoriteMaterial_UI" ... 'u oluştururken herhangi bir hata vermez. Ayrıca, __call__' - '__new__' olarak değiştirirsiniz. bana daha çok anlam ver. Lütfen herkesin aynı kodu çalıştırması için sizi rahatsız eden hatayı görüntüleyen gereksiz bir kitaplık (örneğin, maya, shiboken, vb.) Olmayan bir ** gerçek ** çalışma örneğini deneyin. Eski kodu değiştirmek için gönderinizi düzenleyin. – Silmathoron