簡體   English   中英

隨機列表中的對象屬性在Python中不可訪問

[英]Object Attribute in Random List Not Accessible in Python

我正在研究我的第一個面向對象的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, ...]您沒有得到變量本身或對它們的引用的列表。 相反,您只是得到他們的價值觀。 既然您知道它們已初始化為0 ,就好像您已經編寫了[0, 0, 0, 0, 0, 0] 沒有區別

然后,稍后當您嘗試分配給sample[0] ,實際上只是用一個隨機值覆蓋了存儲在該數組中的0。 myTri ,Python對myTri 連接丟失。

您可以按照以下步驟來獲得想要的效果。 首先,將稍后要分配給變量的名稱列表傳遞給random.sample

sample = random.sample(["a", "b", "c", "d", "e", "f"], 3)

這將給我們3個隨機變量名。 現在,我們要為這些變量分配相同的名稱。 我們可以通過使用特殊的setattr函數來做到這一點,該函數接受一個對象和一個變量名並設置其值。 例如, setattr(myTri, "b", 72)做與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))

這里的主要概念是您在進行反思,也就是自省。 您已經有了動態變量名-您不知道確切地與誰打交道-因此您必須咨詢一些更奇特的語言構造方法。 通常,我實際上會警告您不要假裝,但這是自省是一種合理解決方案的罕見情況。

分配給abc

myTri.a = random.randint(1, 100)
myTri.b = random.randint(1, 100)
myTri.c = random.randint(1, 100)

分配a - f一個隨機屬性:

attrs = ['a', 'b', 'c', 'd', 'e', 'f']
setattr(myTri, random.choice(attrs), random.randint(1, 100))

分配a - f三個隨機屬性:

attrs = ['a', 'b', 'c', 'd', 'e', 'f']
for attr in random.sample(attrs, 3):
  setattr(myTri, attr, random.randint(1, 100))

使用setattr的替代方法:創建Triangle實例時執行此操作。

args = [random.randint(1, 100) for i in xrange(3)] + [0, 0, 0]
random.shuffle(args)
my_tri = Triangle(*args)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM