比较python中所有类实例的属性值

时间:2015-02-25 18:12:43

标签: class python-2.7 instance

我试图编写一个面向对象的程序(作为一种学习练习,我知道可能有更简单的方法),其中珠子围绕由环界定的2D平面。每个珠子是由类球定义的物体。在设置球的初始位置时,我需要检查没有其他球已经放置在相同的x和y坐标处。

#Class for the beads
class ball:
    NumbBalls = 0

    #Constructor
    def __init__(self,Beads):
        self.ball = sphere(pos = vector(0,0,0), radius = radiusBall,color=color.red)
        ball.NumbBalls += 1
        self.ball.pos = self.createInitialPosition(Beads)

    #Assign ball its initial position   
    def createInitialPosition(self,other):
         #CODE to compare self.ball.pos and other.ball.pos which returns a unique position coordinate


#Main program
NumbBeads  = 100
Beads = []#Create empty list for all the beads  

#create balls in random initial positions
Beads = [ball(Beads) for item in range(NumbBeads)]

如果我创建了两个对象bead1和bead2,然后将bead1和bead2作为参数传递,即bead2 = ball(bead1),我可以使用此工作但是如果我生成一个珠子列表并希望所有这些,我该怎么做他们要与自我相比。希望这是有道理的。

1 个答案:

答案 0 :(得分:0)

或许不是你正在采用的方法,你应该考虑这些方面的东西(当然,对你的类定义/方法进行必要的修改):

N = 100
initialPositions = []
while len(initialPositions) <= N:
    newPosition = generateRandomPosition()
    if newPosition in initialPositions:
        pass
    else:
        initialPositions.append(newPosition)

ballList = [ ball(p) for p in initialPositions ]

换句话说,在创建对象之外生成初始位置列表,并在创建过程中执行所需的任何验证/限制。然后只需从该列表中创建对象。如果N非常大,您可能需要考虑字典(或某种类型的可变集)而不是initialPositions的列表,以帮助加快成员资格测试,但它仍然是相同的概念...