Skip to main content
 首页 » 编程设计

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

2025年05月04日16think

我正在研究我的第一个面向对象的 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)是一个合理的解决方案。