【问题标题】:Python Object return a listPython 对象返回一个列表
【发布时间】:2021-03-01 19:28:39
【问题描述】:

我有一个 Deck 类,我从中创建了一个 Deck 对象:

class Deck:
  cards = []

deck = Deck()

如何让卡片组对象在调用时返回卡片列表?

print(deck)

# or

for card in deck:
  # do

不必总是调用deck.cards?

【问题讨论】:

    标签: python python-3.x oop python-class


    【解决方案1】:

    你可以在Deck类中定义__iter__

    class Deck:
        def __init__(self):
            self.cards = [1, 2, 3]
    
        def __iter__(self):
            for i in self.cards:
                yield i
    
    
    deck = Deck()
    for card in deck:
        print(card)
    

    还有这个印刷品:

    1
    2
    3
    

    【讨论】:

      【解决方案2】:

      除了__iter__(self):,您还可以使用__call__(self):。但是,对于后者,您必须将括号附加到 deck,如下所示:deck()

      什么是最好的实际上取决于您的应用/代码的上下文。

      class Deck:
          cards = [1, 2, 3]
      
          def __call__(self):
              return self.cards
      
      deck = Deck()
      
      print(deck())
      

      输出:[1, 2, 3]

      for card in deck():
        print(card)
      

      输出:

      1
      2
      3
      

      我在这里研究了dunder方法:Python Dunder Methods。作者写道,使用单独的类方法通常更好,因为它们更具体。

      也许您可以提供更多背景信息,说明您为什么要使用 deck 而不是 deck.cards

      【讨论】:

        【解决方案3】:

        嗯,有办法:

        import jsons
        
        
        class Deck:
            cards = ['card_1', 'card_2', 'card_3']
        
        
        deck = Deck()
        
        dict_temp = jsons.dump(deck)
        print(dict_temp['cards'])
        
        =>
        ['card_1', 'card_2', 'card_3']
        

        【讨论】:

        • @MelvinAbraham,如果我错了,请纠正我,但我的解决方案中没有看到 deck.cards 的用法。谢谢!
        • 您的答案可能没有错,但显然 OP 在迭代 card 时不想包含任何方法、属性等
        • 另外,您的代码中可能有错字。而不是jsons,您的意思可能是json。最重要的是,它会在json.dump 行中引发错误。
        • @MelvinAbraham,它实际上是一个单独的模块,特性略有不同。如果您愿意,请查看。
        猜你喜欢
        • 2016-08-30
        • 1970-01-01
        • 2020-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多