Noa*_*ark 1 python oop random object
我正在研究我的第一个面向对象的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)
Run Code Online (Sandbox Code Playgroud)
如何将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)
Run Code Online (Sandbox Code Playgroud)
这将给我们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))
Run Code Online (Sandbox Code Playgroud)
这里的主要概念是你做了一些反思,也被称为内省.你有动态的变量名 - 你不确切地知道你在弄乱谁 - 所以你必须咨询一些更奇特的,不受语言结构的影响.通常情况下,我实际上是在警惕这种愚蠢行为,但这是一个罕见的例子,其中内省是一种合理的解决方案.