我想你想在這裏做兩件不同的事情。
首先,你想得到一個特定的球名稱。爲此,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]]
你甚至可能希望從dict
或collections.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}
Python沒有開關的情況下! – William 2013-02-21 21:06:15