gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:48:21 24 4
gpt4 key购买 nike

我正在研究我的第一个面向对象的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com