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

标签 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 属性分配一个随机值。我错过了什么?

最佳答案

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

相关文章:

Python控制台输出到变量

python - python中的随机小数

c++ - 如何高效生成Zipf分布数?

python 3 : Most efficient way to create a [func(i) for i in range(N)] list comprehension

python - 如何使用 python 多线程并行化另一个模块中的函数而不需要对其进行酸洗?

python - 如何用函数连接Pyodbc?

c++ - C++中曲线下的二维随机点

javascript - 如何使用 Javascript 对对象中的年份进行分组?

javascript - 在 Javascript 中定义嵌套对象属性

javascript - 双闭包如何打破循环引用?