Python TypeError: unsupported operand type(s) for +=: 'int' and 'property'



  • #!/usr/bin/env python
    
    class ClassA(object):
    	def __init__(self, a, b, c):
    		self._a=a
    		self._b=b
    		self._c=c
    	@property
    	def calculate(self):
    		return self._a*self._b*self._c
    
    class ClassB(object):
    	def __init__ (self):
    		self._list=[]
    	def addInstanceClassA(self, classA=ClassA):
    		self._list.append(classA)
                    @property # EINRUECKUNG ZERSCHOSSEN
    	def calculate(self):
                    temp = 0
                    for i in self._list:
                            temp+=i.calculate
                    return temp
    
    class ClassC(object):
    	def __init__(self):
                    self._tuple = (0,ClassB) # EINRUECKUNG ZERSCHOSSEN
    	        self._list=[self._tuple]
            def addInstanceClassB(self, date = 0, classB=ClassB):
                    self._tuple=(0,classB)
                    self._list.append(self._tuple)
            @property
            def calculate(self):
                    temp = 0
                    for i in self._list:
                            temp+=i[1].calculate
                    return temp
    
    ###########################
    objA=ClassA(3,10,90)
    objA1=ClassA(3,8,80)
    
    print "objA.calculate:", objA.calculate
    print "objA1.calculate:", objA1.calculate
    print "##########"
    
    objB = ClassB()
    objB.addInstanceClassA(objA)
    objB.addInstanceClassA(objA1)
    print "objB.calculate:", objB.calculate
    
    objB1 = ClassB()
    objB1.addInstanceClassA(objA)
    objB1.addInstanceClassA(objA1)
    print "objB1.calculate:", objB1.calculate
    
    print "##########"
    objC = ClassC()
    objC.addInstanceClassB(objB)
    objC.addInstanceClassB(objB1)
    
    print objC.calculate
    
    ##########################
    

    Objekte der ClassA führen eine Berechnung durch.
    ClassB hält Objekte der ClassA in einer Liste und summiert die Ergebnisse der Berechnung der einzelnen Objekte der ClassA.
    Class C hält eine Liste von Tuples. Das erste Element jeder Tuple ist ein Dummy-Wert, das zweite ein Objekt der ClassB. Nun soll die Summe der Ergebnisse der Berechnungen der ClassB berechnet werden. Und hierbei tritt der Fehler auf:

    @property
            def calculate(self):
                    temp = 0
                    for i in self._list:
                            temp+=i[1].calculate
                    return temp
    
    TypeError: unsupported operand type(s) for +=: 'int' and 'property'
    

    Temp ist ein int. Meiner Meinung nach sollte

    i[1].calculate
    

    das i-te Element einer Liste aus Tuples sein, wobei an Position [1] der Tuple ein Objekt vom Typ ClassB liegt. ClassB.calculate liefert einen int zurück. Wo ist der Fehler?

    PS: "[code]" kommt hier offenbar teilweise nicht mit den Einrückungen klar.



  • Fehler durch copy&past. So muss ClassC aufgerufen werden:

    objC = ClassC()
    objC.addInstanceClassB(0,objB)
    objC.addInstanceClassB(0,objB1)
    
    print objC.calculate
    

    Das ändert aber nichts am Problem.



  • In der __init__ von ClassC steht:

    self._list=[self._tuple]
    

    Das ist natürlich Schwachsinn. Folge: es ist an 1. Position der Liste und an 2.Position der Tuple ClassB zu finden. Daher:

    self._list=[]
    

    Und das darüber stehende self._tuple = (0,ClassB) ist in dem Beispiel überflüssig.

    Danke dennoch!


Anmelden zum Antworten