python:使用list调用实例属性
我试图在类实例的列表中使用元素。我不确定我是否使用了正确的术语,因为我是python新手,但下面是一个代码示例: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]是一个字符串。附
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,没有任何属性。@RehanAzhergetattr
在这里有什么帮助吗?在他的代码中,没有一个对象的属性名为“一”。“[numbers(“a”)、numbers(“b”)]”我有一种直觉,你真正想要的是一个。如果我错了,请忽略我。它的getattr也在下面的链接中得到了回答:您没有将list[0]
设置为创建的对象one
,因此它仍然是一个str,没有任何属性。@RehanAzhergetattr
在这里有什么帮助吗?在他的代码中,没有一个对象的属性名为“一”。“[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的部分原因。)字典肯定是有用的