随机列表中的对象属性在Python中不可访问

时间:2009-07-01 00:57:38

标签: python random object oop

我正在研究我的第一个面向对象的python,我有以下内容:

#!/usr/bin/python 
import random 

class triangle:

# Angle A To Angle C Connects Side F
# Angle C to Angle B Connects Side D
# Angle B to Angle A Connects Side E

    def __init__(self, a, b, c, d, e, f):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        self.e = e
        self.f = f

    #def solver:
        #pass

#initialize Triangle
myTri = triangle(0,0,0,0,0,0)

#Pick Three Random Angles or Sides to Generate Values For
sample = random.sample([myTri.a, myTri.b, myTri.c, myTri.d, myTri.e, myTri.f],  3)

#Sets the three randomly picked variables to a Random Number



sample[0] = random.randint(1, 100)
sample[1] = random.randint(1, 100)
sample[2] = random.randint(1, 100)

如何将myTri.a传递给random.randint。它传递了初始化的'0'值。我希望能够为myTri的三个.a-.f属性分配一个随机值。我错过了什么?

3 个答案:

答案 0 :(得分:5)

当您说[myTri.a, myTri.b, ...]时,您没有获得变量本身的列表或对它们的引用。相反,你只是得到他们的价值观。由于您知道它们已初始化为0,因此就好像您已编写[0, 0, 0, 0, 0, 0]一样。没有区别。

然后,当您尝试分配给sample[0]时,实际上只是用随机值覆盖存储在该数组中的0。 Python在那时对myTri一无所知;连接丢失了。

这是你可以做的,以达到你的目标。首先,将我们要分配的变量名称列表传递给random.sample

sample = random.sample(["a", "b", "c", "d", "e", "f"], 3)

那将给我们3个随机变量名称。现在我们要分配具有相同名称的变量。我们可以通过使用特殊的setattr函数来实现,该函数接受一个对象和一个变量名并设置其值。例如,setattr(myTri, "b", 72)myTri.b = 72做同样的事情。所以改写了我们:

setattr(myTri, sample[0], random.randint(1, 100))
setattr(myTri, sample[1], random.randint(1, 100))
setattr(myTri, sample[2], random.randint(1, 100))

这里的主要概念是你正在做一些反思,也称为内省。你有动态的变量名 - 你不确切地知道你在弄乱谁 - 所以你必须咨询一些更奇特的,不受语言结构的影响。通常情况下,我实际上是在警惕这种愚蠢行为,但这是一个罕见的例子,内省是一种合理的解决方案。

答案 1 :(得分:2)

要分配到abc

myTri.a = random.randint(1, 100)
myTri.b = random.randint(1, 100)
myTri.c = random.randint(1, 100)

a - f分配一个随机属性:

attrs = ['a', 'b', 'c', 'd', 'e', 'f']
setattr(myTri, random.choice(attrs), random.randint(1, 100))

a - f分配三个随机属性:

attrs = ['a', 'b', 'c', 'd', 'e', 'f']
for attr in random.sample(attrs, 3):
  setattr(myTri, attr, random.randint(1, 100))

答案 2 :(得分:0)

使用setattr的替代方法:在创建Triangle实例时执行此操作。

args = [random.randint(1, 100) for i in xrange(3)] + [0, 0, 0]
random.shuffle(args)
my_tri = Triangle(*args)