0

我正在从我的一本书中阅读源代码,并且我正在寻找一些令人困惑的源代码的输出。我认为我向你展示比试图完全解释它更好。

class Cards(object):
   RANK=["A","2","3","4","5","6","7","8","9","10","J","Q","K"]
   SUIT=["c","d","h","s"]

   def __init__(self,rank,suit):
      self.rank=rank
      self.suit=suit

   def __str__(self):
      rep=self.rank+self.suit
      return rep


class Hand(object):
   def __str__(self):
      self.cards=[]
      if self.cards:
         rep=" "
         for card in self.cards:
          rep+=str(card) + "  "
      else:
         rep="<empty>"

      return rep

   def add(self,card):
      self.cards.append(card)

   def give(self, card, other_hand):
      self.cards.remove(card)
      other_hand.add(card)


b=Cards(rank="A", suit="c")

myhand=Hand()
print(myhand)

myhand.add(b)
print(myhand)

在这种情况下,解释器在两种情况下都返回一个空值,即使我给 self.card 两个值。但是,如果我声明 init () 方法,并首先在该方法中初始化 self.card,那么它将正常运行并给我 myhand 的新值,这将是我添加到它的 self.card 属性中的任何值。但是,为什么我必须先在init函数中声明和初始化first.card呢?为什么它可以在 str 函数中以相同的方式工作?是因为init()函数在我第一次调用类时首先执行还是什么?

此外,在我放置 rep=str(card) 的地方,如果我将 card 更改为 self.cards,当我告诉它打印时,它就会开始给我内存地址。再次,这是为什么?为什么它不只是向我显示代表中 self.cards 的值?

4

2 回答 2

1

解释器正在返回<empty>,因为每次您调用print(myhand)时,解释器都会打印myhand.__str__()返回的内容。在此示例中,您是:

  1. 设置self.cards为空列表。
  2. 检查是否self.cards不为空,即为false
  3. 代码继续else:返回子句<empty>

如果您在创建对象后放入self.cards = []__init__调用一次的方法,并从中删除上述行,__str__它应该可以正常工作 - 卡片列表不会被覆盖。

此外,str(self.cards)还为您提供内存地址列表,因为对象str方法用于打印其自身的值。如果您在类中定义一个方法,类似于then 它会正常工作。list__repr____repr__Cards__str__

class NoRepr(object):
     def __str__(self):
         return '__str__'     

class WithRepr(object):
     def __str__(self):
         return '__str__'
     def __repr__(self):
         return '__repr__'


[NoRepr(), NoRepr()]
[<__main__.NoRepr at 0x9907c0c>, <__main__.NoRepr at 0x9907a4c>]

[WithRepr(), WithRepr()]
[__repr__, __repr__]
于 2013-08-18T20:59:21.693 回答
0

空手问题

  • __init__当您创建类的实例时调用该方法。
  • 它显示为空的原因是该语句self.cards=[]清除了卡片列表。因此,当您打印有多少张卡片时,没有一张。

第一个错误被您在添加之前打印手的事实所掩盖b。相反,如果代码看起来像:

myhand=Hand()
myhand.add(b)
print(myhand)

该声明if self.cards:会给你错误:AttributeError: 'Hand' object has no attribute 'cards'


字符串表示问题

  • rep=str(self.cards)调用strpython 列表对象上的方法,因为它是一个Cards对象列表。该方法将调用__repr__列表中的每个对象。要修复它,请定义以下方法。
# Cards class
def __repr__(self):
   return str(self)
于 2013-08-18T20:58:36.977 回答