2013-02-21 51 views
0

的列表得到一個特定屬性我有對象蟒從對象

class ball(self, size, color, name): 
    self.size = size 
    self.color = color 
    self.name = name 

然後,用戶將輸入一個名字和通過命令行的屬性的蟒陣列。例如,用戶可以輸入「name1」,然後輸入「color」或「weirdName」,然後輸入「size」...然後我想根據名稱找到對象並打印得到顏色對象或尺寸對象。我可以這樣做嗎?還是我需要使用開關盒?

感謝

+0

Python沒有開關的情況下! – William 2013-02-21 21:06:15

回答

0

我想你想在這裏做兩件不同的事情。

首先,你想得到一個特定的球名稱。爲此,gnibbler已經給了你答案。

然後,您想要按名稱獲得球的某個屬性。爲此,使用getattr

the_ball = next(b for b in list_of_balls if b.name == sys.argv[1]) 
the_value = getattr(the_ball, sys.argv[2]) 
print('ball {}.{} == {}'.format(sys.argv[1], sys.argv[2], the_value) 

此外,您class定義是錯誤的:

class ball(self, size, color, name): 
    self.size = size 
    self.color = color 
    self.name = name 

你可能意味着這是ball類中的__init__方法,而不是class定義本身:

class ball(object): 
    def __init__(self, size, color, name): 
    self.size = size 
    self.color = color 
    self.name = name 

但是,您可能需要重新考慮您的設計。如果您通過名稱動態訪問屬性的頻率比直接訪問屬性的次數要多,通常最好只存儲dict。例如:

class Ball(object): 
    def __init__(self, size, color, name): 
     self.name = name 
     self.ball_props = {'size': size, 'color': color} 

list_of_balls = [Ball(10, 'red', 'Fred'), Ball(20, 'blue', 'Frank')] 

the_ball = next(b for b in list_of_balls if b.name == sys.argv[1]) 
the_value = the_ball.ball_props[sys.argv[2]] 

你甚至可能希望從dictcollections.MutableMapping或任何繼承,所以你可以這樣做:

the_value = the_ball[sys.argv[2]] 

而且,你可能要考慮使用的球的dict鍵控按名稱,而不是一個列表:

dict_of_balls = {'Fred': Ball(10, 'red', 'Fred'), …} 
# ... 

the_ball = dict_of_balls[sys.argv[1]] 

如果你已經建立了list,你可以從它漂亮的建立dict易:

dict_of_balls = {ball.name: ball for ball in list_of_balls} 
1

如果你知道恰好有一個比賽,你可以這樣做:

the_ball = next(b for b in list_of_balls if b.name == ???) 

如果有多個,那麼你可以得到一個列表:

the_balls = [b for b in list_of_balls if b.name == ???] 

如果您主要是通過名字查找球,你應該把它們保存在字典中而不是列表中

要通過名字使用getattr

getattr(the_ball, "size") 

這樣做的屬性可以是一個壞主意

getattr(the_ball, user_input) 

如果什麼USER_INPUT是"__class__"或別的東西,你沒有想到?

如果只有幾種可能性,最好是明確

if user_input == "size": 
    val = the_ball.size 
elif user_input in ("colour", "color"): 
    val = the_ball.color 
else: 
    #error 
+1

+1。但我認爲(雖然我不確定),這隻能回答他的問題的前半部分;他也希望通過名稱獲得'the_ball'的屬性。所以完整的答案就像你的陳述,接着是'the_attr = getattr(the_ball,user_given_attr_name)'。 – abarnert 2013-02-21 21:07:36

+0

是的,但然後我只想輸出其中一個值,根據用戶輸入的內容大小或顏色 – thebiglebowski11 2013-02-21 21:07:55

0

如果我正確理解,你需要從球的列表獲取特定球,基於屬性的值。解決方案是:

attribute_value = sys.argv[1] 
attribute_name = sys.argv[2] 
matching_balls = [ball_item for ball_item in list_balls if \ 
    getattr(ball_item, attribute_name) == attribute_value]