شی گرایی یعنی خلق چیز هایی که وجود ندارند، تا اینجا یاد گرفتیم که چطور یک شی به نام کارت با خصوصیات مخصوص به خود را به وجود آوریم. به کار خود ادامه می دهیم و دسته های کارت را تعریف میکنیم. در دنیای کارت بازی به هر دسته کارت یک Deck میگویند. هر deck 52 کارت را درون خود نگهداری میکند و متد هایی مانند بر زدن و اضافه یا حذف کارت را در خود دارد.
همراه ما باشید تا با نحوه پیاده سازی این کلاس آشنا شوید.
مشخص است وقتی یک شی از کلاس deck تولید میشود، به طور پیش فرض ۵۲ کارت را دارد. پس میدانیم این کارت ها را باید در متد __init__ تولید کنیم. برای تولید ۵۲ کارت از حلقه های تو در تو استفاده میکنیم تا این کار راحت تر صورت گیرد:
class Deck: def __init__(self): self.cards = [] for suit in range(4): for rank in range(1, 14): self.cards.append(Card(suit, rank))
حلقه بیرونی خال ها و حلقه درونی rank ها را مشخص میکند و کارت های تولید شده را در یک لیست به نام cards ذخیره میکند.
حالا اگر یک شی از کلاس deck بسازیم و کارت های آن را چاپ کنیم میبینیم که تمامی کارت ها ساخته شده اند. پس بیرون از کلاس مینویسیم:
deck = Deck() for card in deck.cards: print(card) # Ace of Clubs # ۲ of Clubs # ۳ of Clubs # ۴ of Clubs # ۵ of Clubs …
میخواهیم تابعی بنویسیم به نام print_cards که با صدا زدن آن، کارت های درون تابع چاپ شوند. پس:
class Deck: . . . def print_cards(self): for card in self.cards: print(card)
از این پس نماد ( . . . ) به این معنی است که یک سری توابع را در این متن خلاصه کرده ایم تا جای کمتری بگیرد.
حالا با صدا زدن این تابع میتوانیم کارت های خود را ببینیم. بیرون از کلاس مینویسیم:
deck = Deck() deck.print_cards() # Ace of Clubs # ۲ of Clubs # ۳ of Clubs # ۴ of Clubs # ۵ of Clubs
یک روش دیگر برای نمایش کارت ها وجود دارد که میتوانیم از آن استفاده کنیم. میتوانیم برای کلاس Deck یک متد __str__ بنویسیم تا با پرینت کردن اشیا این کلاس، کارت ها را ببینیم.
میخواهیم برای زیبایی کار، این کارت ها به صورت آبشاری چاپ شوند پس :
class Deck: . . . def __str__(self): s = "" for i in range(len(self.cards)): s += " "*i + str(self.cards[i]) + "\n" return s
یک انباشتگر به نام s داریم که کارت ها درون آن ذخیره میشوند. دستور “ “*i باعث میشود هربار به تعداد شماره کارت یک فاصله چاپ شود تا نتیجه بصورت آبشاری باشد.
نتیجه به صورت زیر میشود:
deck = Deck() print(deck) # Ace of Clubs ۲ of Clubs ۳ of Clubs ۴ of Clubs ۵ of Clubs ۶ of Clubs ۷ of Clubs ۸ of Clubs ۹ of Clubs ۱۰ of Clubs Jack of Clubs