我正在研究我的第一个面向对象的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属性分配一个随机值。我想念什么?

最佳答案

当您说[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))


这里的主要概念是您在进行反思,也就是自省。您已经有了动态变量名-您不知道确切地与谁打交道-因此您必须咨询一些更奇特的语言构造方法。通常,我实际上会警告您不要假装,但这是自省是一种合理解决方案的罕见情况。

10-06 16:03