【问题标题】:python: using list to call instance attributepython:使用列表调用实例属性
【发布时间】:2018-09-14 21:41:03
【问题描述】:

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

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

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

one = numbers('a')

我正在尝试使用列表来做这样的事情:

print(list[0].letter)

这似乎不起作用,因为 list[0] 是一个字符串。有解决办法吗?提前致谢。

【问题讨论】:

  • 它的 getattr ,也在下面的链接上回答:stackoverflow.com/questions/4821104/…
  • 你没有将list[0]设置为创建的对象one,所以它仍然是一个str,没有任何属性。
  • @RehanAzher getattr 在这里如何提供帮助?在他的代码中没有任何对象具有名为'one' 的属性。
  • `[numbers("a"), numbers("b")]'
  • 我有一种直觉,你真正想要的是enum。如果我错了,请忽略我。

标签: python string list class instance


【解决方案1】:

你真的不想做你要求的事情。 Ned Batchelder 有a great explanation of why。我有a not as great one

但是,如果您已经阅读了这些内容,并且确信您确实遇到了其中一种确实是正确做法的罕见情况,那么按名称查找全局变量的方法是使用 @ 987654323@函数获取全局命名空间作为字典,然后在那里查找:

>>> 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。您甚至可以一举建立字典和数字:

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

【讨论】:

  • 使用全局变量的好方法,但以这种方式访问​​对象确实看起来不对。
  • @Vinny 是的,我很确定这看起来是错误的故意。 Python 迫使你通过让它看起来很奇怪来向读者强调你正在做一些奇怪的事情。 (与 Tcl 相比,这将是完全惯用的,而且……这也是我们现在使用 Python 而不是 Tcl 的部分原因。)
  • 字典肯定能用,谢谢@abarnert!
【解决方案2】:

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

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

然后你创建一个 numbers 类型的对象:

one = numbers('a')

这个新对象不在您的列表中。因此,当您访问 list[0] 时,您将返回字符串 'one'

您需要先创建对象,然后再将它们添加到列表中,然后再创建列表。

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

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

【讨论】:

  • 不,重新绑定 one不会更改 list_[0]
  • @abarnert 你是对的。我自己也糊涂了。从我的回答中删除它,感谢您的评论。
  • 您想在它们在列表中之后为其分配值?
  • 我试图避免为列表中的元素分配任何内容,因为它们在我的实际代码中的其他地方使用。
  • 你不能用不存在的对象创建一个列表,所以你必须先创建它们。如果您需要不断更改它们并且不想对实际元素进行更改,请创建这些对象的副本。
【解决方案3】:

像这样?

one = numbers('a')
two = numbers('b')
three = numbers('c')
list = [one, two, three]

结果如下。

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

【讨论】:

  • 它没有解释问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 2016-12-11
  • 2013-04-22
  • 2013-11-18
  • 2011-11-24
  • 2019-05-28
相关资源
最近更新 更多