2017-06-22 63 views
0

我有一个名为Robot的类,它创建了类SegmentPointmass的许多实例。所有这些实例都有一个变量mass。如何获得具有相同变量名mass的对象内的所有对象的总质量?添加同名类内实例的所有变量

我现在做什么:

class Robot: 
    def __init__(self, massJoint1, massJoint2, massJoint3, massSlide, reachSlide, massArm, lengthArm): 
     self.joint1 = Pointmass(massJoint1) 
     self.joint2 = Pointmass(massJoint2) 
     self.joint3 = Pointmass(massJoint3) 

     self.slide = Slide(massSlide, reachSlide) 
     self.arm = Arm(massArm, lengthArm) 

     self.totalmass = self.joint1.mass + self.joint2.mass + self.joint3.mass + self.slide.mass + self.arm.mass 

    def printVars(self): 
     attrs = vars(self) 
     print(', \n'.join("%s: \t%s" % item for item in attrs.items())) 
     print() 


class Pointmass: 
    def __init__(self, mass): 
     self.mass = mass 

     self.location = None 


class Segment: 
    def __init__(self, mass): 
     self.mass = mass 

     self.start = None 
     self.end = None 

在这

self.totalmass = self.joint1.mass + self.joint2.mass + self.joint3.mass + self.slide.mass + self.arm.mass 

是一个很长的线,并且是当Robot获得更多武器和关节...真的是不方便有更好的方法来获得总质量?

+1

使用列表,for循环和'* args'? – 2017-06-22 12:30:34

+2

好像你的'joint1','joint2','joint3'应该在列表中。 – khelwood

+4

如果您的机器人肢体太多,这表明您应该将它们存储在列表中。 –

回答

2

您不应该将关节存储在单独的属性中。相反,存储一个简单的joints列表;那么你可以简单地使用sum和一个生成器表达式。

self.totalmass = sum(j.mass for j in self.joints) 
+0

但在这种情况下,我将不得不记得哪个联合在列表中的哪个索引?我宁愿给他们一个独特的名字,也许我不应该在例子中使用'jointx' ... –

+1

在这种情况下,你可以使用一个字典并通过'self.joints.values()'遍历。或者,如果你必须的话,把它们保持为独立的属性,但是通过'[self.joint1,self.joint2]'等迭代 –