__str__ prints "instance at 0x00E4F558"

This is my first cry for help on this site. I searched for the answer here, but nothing really clears it for me.

I am trying to learn Python. I have a class in my chapter. The following code:

class Character: def __init__(self, name, initial_health): self.name = name self.health = initial_health self.inventory = [] def __str__(self): s = "Name: " + self.name s += "| Health: " + str(self.health) s += "| Inventory: " + str(self.inventory) return s def grab(self, item): self.inventory.append(item) me = Character("vic", 37) me.grab("pencil") me.grab("paper") print str(me) 

... produces:

 Name: vic| Health: 37| Inventory: ['pencil', 'paper'] 

But the following code, which seems pretty similar to me, prints memory cells, not the variables themselves:

 import random SUITS = ['C', 'S', 'H', 'D'] RANKS = ['A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K'] VALUES = {'A':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, 'T':10, 'J':10, 'Q':10, 'K':10} # define card class class Card: def __init__(self, suit, rank): if (suit in SUITS) and (rank in RANKS): self.suit = suit self.rank = rank self.value = self.get_value() else: print "Invalid card: " + str(suit) + str(rank) def __str__(self): return str(self.suit) + str(self.rank) def get_cardDetails(self): return self.suit + self.rank + ": " + str(self.value) def get_suit(self): return self.suit def get_rank(self): return self.rank def get_value(self): value = VALUES[self.rank] return value class Hand: def __init__(self, card1, card2): self.cardCount = 0 self.cards = [] self.cards.append(card1) self.cardCount += 1 self.cards.append(card2) self.cardCount += 1 self.value = self.get_value() print "Dealed hand: " + str(self.cards[0]) + str(self.cards[1]) print "Dealed hand: " + str(self.cards) def __iter__(self): return iter(self.cards) def __str__(self): return str(self.cards) def get_details(self): print "Hand: " for each in self.cards: print " -" + str(each) + ": " + str(each.value) s = "Cards: " + str(self.cardCount) + \ " | Hand: " + str(self.cards) + \ " | Total Value: " + str(self.value) + " |" return s def add_card(self, card): self.cards.append(card) self.cardCount += 1 self.value = self.get_value() print "Added: " + str(card) def get_value(self): value = 0 for each in self.cards: value = value + each.value return value c1 = Card("C", "2") c2 = Card("C", "3") h = Hand(c1, c2) print str(h) 

Output:

 Dealed hand: C2C3 Dealed hand: [<__main__.Card instance at 0x00E4F558>, <__main__.Card instance at 0x00E543C8>] [<__main__.Card instance at 0x00E4F558>, <__main__.Card instance at 0x00E543C8>] 

I’m sure that something must be missing for me - I’m still studying it. Any help would be appreciated. Thank you in advance. And sorry for the long post.

+4
source share
3 answers

The __str__ method of a list calls __repr__ for list items, not __str__ . You can either iterate over the list by typing elements on str, or write the Hand class, which subclasses from the list and defines __str__ to call __str__ for its elements.

+6
source

It depends on what you are trying to print. In Python, if you print an object a , it is first converted to a string, evaluating a.__str__() . If your class has a specific __str__ method, Python uses it. Otherwise, it uses the __str__ method from object (in the new style classes and in Python 3.x).

In any case, the method of printing objects depends on the method of implementing the __str__ method. If you evaluate str(els) , where els is a list, then Python actually calls List.__str__(lis) , and this function is implemented in such a way that it prints repr objects contained inside. (And the repr function returns by default the output you see.)

If you want to use the str methods of objects, you can write:

 [str(el) for el in els] 

where els is a list of your objects.

+1
source

Lists print repr() their elements, not str() . Add:

 __repr__ = __str__ 

in the definition of the class Card . This will make repr() your Card class the same as str() , and lists will print your cards as you expect.

Instead, you can write __str__ from Hand to take str() , not repr() of list items.

+1
source

Source: https://habr.com/ru/post/1491194/


All Articles