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