我正在研究我的第一个面向对象的 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, ...]
时,您不会获得变量本身的列表或对它们的引用。相反,您得到的只是他们的值(value)。因为您知道它们被初始化为 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))
这里的主要概念是您要进行一些反射(reflection),也称为内省(introspection)。你有动态变量名——你不知道你在和谁打交道——所以你必须咨询一些更奇特的、不符合语言构造的方式。通常情况下,我实际上会警告不要犯这种傻事,但这是一个罕见的例子,内省(introspection)是一个合理的解决方案。
关于python - 随机列表中的对象属性在 Python 中不可访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1066827/