python:使用list调用实例属性

python:使用list调用实例属性,python,string,list,class,instance,Python,String,List,Class,Instance,我试图在类实例的列表中使用元素。我不确定我是否使用了正确的术语,因为我是python新手,但下面是一个代码示例: list = ['one', 'two', 'three'] class numbers: def __init__(self, letter): self.letter = letter one = numbers('a') 我正在尝试使用列表来执行以下操作: print(list[0].letter) 这似乎不起作用,因为列表[0]是一个字符串。附

我试图在类实例的列表中使用元素。我不确定我是否使用了正确的术语,因为我是python新手,但下面是一个代码示例:

list = ['one', 'two', 'three']

class numbers:
    def __init__(self, letter):
        self.letter = letter

one = numbers('a')
我正在尝试使用列表来执行以下操作:

print(list[0].letter)
这似乎不起作用,因为列表[0]是一个字符串。附近有工作吗?提前谢谢。

像这样吗

one = numbers('a')
two = numbers('b')
three = numbers('c')
list = [one, two, three]
结果如下

>>> print(list[0].letter)
a
像这样

one = numbers('a')
two = numbers('b')
three = numbers('c')
list = [one, two, three]
结果如下

>>> print(list[0].letter)
a

在列表中创建3个字符串:

list = ['one', 'two', 'three']
然后创建一个编号类型的对象:

one = numbers('a')
此新对象不在列表中。因此,当您访问
列表[0]
时,您将返回字符串
'one'

在将对象添加到列表之前,需要先创建对象,然后再创建列表

one = numbers('a')
two = numbers('b')
list_ = [one, two]
list_[0].letter
'a'

您混淆的部分是字符串
'one'
one
变量的对象引用不是一回事。后者是一个对象,具有字母属性。前者只是一个字符串。

在列表中创建3个字符串:

list = ['one', 'two', 'three']
然后创建一个编号类型的对象:

one = numbers('a')
此新对象不在列表中。因此,当您访问
列表[0]
时,您将返回字符串
'one'

在将对象添加到列表之前,需要先创建对象,然后再创建列表

one = numbers('a')
two = numbers('b')
list_ = [one, two]
list_[0].letter
'a'

您混淆的部分是字符串
'one'
one
变量的对象引用不是一回事。后者是一个对象,具有字母属性。前者只是一个字符串。

你真的不想做你要求的事情。内德·巴奇尔德有。我有

但是,如果您已经阅读了这些内容,并且确信确实存在这样一种罕见的情况:按名称查找全局变量的方法是使用函数将全局名称空间作为字典,然后在那里查找:

>>> lst = ['one', 'two', 'three']
>>> one = numbers('a')
>>> globals()[lst[0]].letter
'a'

请注意,如果您首先创建并使用字典,则可以更轻松、更易懂地完成此操作:

>>> dct = {'one': numbers('a'), 'two': numbers('b'), 'three': numbers('c')}
>>> dct['one'].letter
'a'
>>> dct[lst[0]].letter
'a'
而且,除了更具可读性和明确性之外,它还更强大,因为您可以构建任何您想要的dict,而不仅仅是
globals
拥有的任何dict。您甚至可以一次性将dict和数字组合在一起:

>>> numbers = (numbers(letter) for letter in string.ascii_lowercase)
>>> dct = dict(zip(lst, numbers))

你真的不想做你要求的事。内德·巴奇尔德有。我有

但是,如果您已经阅读了这些内容,并且确信确实存在这样一种罕见的情况:按名称查找全局变量的方法是使用函数将全局名称空间作为字典,然后在那里查找:

>>> lst = ['one', 'two', 'three']
>>> one = numbers('a')
>>> globals()[lst[0]].letter
'a'

请注意,如果您首先创建并使用字典,则可以更轻松、更易懂地完成此操作:

>>> dct = {'one': numbers('a'), 'two': numbers('b'), 'three': numbers('c')}
>>> dct['one'].letter
'a'
>>> dct[lst[0]].letter
'a'
而且,除了更具可读性和明确性之外,它还更强大,因为您可以构建任何您想要的dict,而不仅仅是
globals
拥有的任何dict。您甚至可以一次性将dict和数字组合在一起:

>>> numbers = (numbers(letter) for letter in string.ascii_lowercase)
>>> dct = dict(zip(lst, numbers))


它的getattr也在下面的链接中得到了回答:您没有将
list[0]
设置为创建的对象
one
,因此它仍然是一个str,没有任何属性。@RehanAzher
getattr
在这里有什么帮助吗?在他的代码中,没有一个对象的属性名为“一”。“[numbers(“a”)、numbers(“b”)]”我有一种直觉,你真正想要的是一个。如果我错了,请忽略我。它的getattr也在下面的链接中得到了回答:您没有将
list[0]
设置为创建的对象
one
,因此它仍然是一个str,没有任何属性。@RehanAzher
getattr
在这里有什么帮助吗?在他的代码中,没有一个对象的属性名为“一”。“[numbers(“a”)、numbers(“b”)]”我有一种直觉,你真正想要的是一个。如果我错了,请忽略我。它不能解释问题它不能解释问题否,重新绑定
one
不会改变
list[0]
@abarnert你是对的。我自己也弄糊涂了。将其从我的答案中删除,并感谢您的评论。您想在列表中的元素出现后为其赋值吗?我试图避免为列表中的元素赋值,因为它们在实际代码中的其他地方使用。您无法创建包含不存在对象的列表,因此必须先创建它们。如果您需要继续更改它们,并且不想在实际元素上执行此操作,请创建这些对象的副本。不,重新绑定
one
不会更改
list[0]
@abarnert您是对的。我自己也弄糊涂了。将其从我的答案中删除,并感谢您的评论。您想在列表中的元素出现后为其赋值吗?我试图避免为列表中的元素赋值,因为它们在实际代码中的其他地方使用。您无法创建包含不存在对象的列表,因此必须先创建它们。如果您需要不断更改它们,并且不想在实际元素上这样做,请创建这些对象的副本。使用全局变量的解决方法不错,但这样访问对象看起来确实是错误的。@Vinny是的,我很确定这看起来是故意的错误。Python迫使您通过使其看起来怪异来向读者强调您正在做一些怪异的事情。(与Tcl相比,Tcl非常地道,这也是我们现在使用Python而不是Tcl的部分原因。)字典肯定能用,谢谢@abarnert!使用globals是一个不错的解决方法,但这样访问对象看起来确实是错误的。@Vinny是的,我很确定这看起来是故意的错误。Python迫使您通过使其看起来怪异来向读者强调您正在做一些怪异的事情。(与Tcl相比,Tcl是非常地道的,这也是我们现在使用Python而不是Tcl的部分原因。)字典肯定是有用的