Can you use self in __str__

Jean-Michel Pichavant jeanmichel at sequans.com
Thu Dec 4 14:22:11 EST 2014


----- Original Message -----
> From: "Seymore4Head" <Seymore4Head at Hotmail.invalid>
> To: python-list at python.org
> Sent: Friday, 28 November, 2014 4:31:50 AM
> Subject: Re: Can you use self in __str__
> 
> On Thu, 27 Nov 2014 21:49:29 -0500, Dave Angel <davea at davea.name>
> wrote:
> 
> class Hand:
>     def __init__(self):
>         self.hand = []
>         # create Hand object
> 
>     def __str__(self):
>         s = 'Hand contains '
>         for x in self.hand:
>             s = s + str(x) + " "
>         return s
> 
> I am using 2.7 (Codeskulptor).  This is working code.  It starts with
> an empty list that gets appended from a full deck of shuffled cards.
> dealer=Hand()
> player=Hand()
> I don't really know how to post working code without posting a lot.
>  I
> am not being too successful in trying to post enough code to have it
> work without posting the entire code.
> Here is the link if you want to run it.
> http://www.codeskulptor.org/#user38_Kka7mh2v9u_9.py
> The print out looks like this:
> Hand contains H4 DQ.
> 
> I can (and am) currently printing the hand like this:
> print "Player's",player
> print "Dealer's",dealer
> 
> My question is can you add (self) in the __str__ so when you issue
> the
> command "print player" the "player" part is included in the __str__.
> --
> https://mail.python.org/mailman/listinfo/python-list


I think your main problem is a design issue.

I won't go into details, it would be too long but here's a way to fix your problem:

# Untested code

class Player(object):
  def __init__(self, name):
    self.name = name
    self.hand = Hand()
  
  def __str__(self):
    return '%s<%s> has %s' % (self.__class__.__name__, self.name, self.hand)

# A dealer is a special type of player
class Dealer(Player): pass

def deal():
    global outcome, in_play,deck,dealer,player
    
    # your code goes here
    deck=Deck()
    deck.shuffle()
    print deck
    players = [Dealer('Robert'), Player('John')]

    for deal in range(2):
      for player in players:
        player.hand.add_card(deck.deal_card())

    for player in players:
      print str(player)
    in_play = True


With the above design, the relation between player and its hand is implemented with the Player attribute "hand".
It's a classic design where the container knows about the content, but the content does not know its container.

There are other solutions which do not require a new class, but I have the feeling you will need the Player class in the future.

Moreover The design above I gave you will be probably broken in the future when you add features to your code.

The same player may be a dealer or not, it may vary over time. You will probably need a 'Table' object which handles a collection of players, with a dealer, small blind, big blind etc, amount of money in the pot etc...

JM


-- IMPORTANT NOTICE: 

The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.


More information about the Python-list mailing list