繁体   English   中英

在python中调用另一个内部的一个类的方法

[英]calling one class's method inside another in python

我该如何调用属于Deck类的shuffle和takecard方法,并在Dealer类中调用它而不继承整个类。

#!/usr/bin/python
import random
class Card:
    """A card object with a suit and rank."""
    RANKS = (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)
    SUITS = ('Spades', 'Diamonds', 'Hearts', 'Clubs')
    def __init__(self, rank, suit):
       self._rank = rank
       self._suit = suit
    def getRank(self):
       return self._rank
    def getSuit(self):
       return self._suit
    def __str__(self):
       translate = {11:'Jack', 12:'Queen', 13:'King', 14: 'Ace'}
       r = self._rank
       if r in [11, 12, 13, 14]:
          myrank = translate[r]
       else:
          myrank = str(r)
       return myrank + " of " + self._suit
    def __lt__(self, other):
        return( self._rank < other.getRank() )
class Deck:
    def __init__(self):
        self._cards = []
        for suit in Card.SUITS:
            for rank in Card.RANKS:
                c = Card(rank, suit)
                self._cards.append(c)
    def shuffle(self):
        random.shuffle(self._cards)
    def takecard(self):
        if len(self._cards) == 0:
            return None
        else:
            #print self._cards.pop()
            return self._cards.pop()
    def __len__(self):
        return len(self._cards)
    def __str__(self):
        result = ""
        for c in self._cards:
            result = result + str(c) + '\n'
        return result
class Dealer(object):
    def __init__(self, name):
        self.name = name
    def shuffle(self):
        deck=self.deck
        self.deck.shuffle()     
    def deal(self):
        self.deck.takecard()

如果我这样声明self.deck.takecard和self.deck.shuffle不会返回Deck方法: Dealer('Bob',Deck)

如果要在创建Dealer的实例时传递Deck的实例,将平台作为属性附加到经销商,然后从经销商的功能中调用平台的功能,则可以执行以下操作:

class Dealer(object):
    def __init__(self, name, deck):
        self.name = name
        self.deck = deck
    def shuffle(self):
        self.deck.shuffle()
    def deal(self):
        return self.deck.takecard()

您作为参数'deck'传入的对象必须是Deck的一个实例:

a_deck = Deck()

我相信您的代码存在的问题是您需要从Dealer函数返回,而不仅仅是从Deck的函数返回,如下所示。 您还需要在初始化程序中设置平台:

class Dealer(object):
    def __init__(self, name, deck):
        self.name = name
        self.deck = deck

    def shuffle(self):
        deck=self.deck
        return self.deck.shuffle()
    def deal(self):
        return self.deck.takecard()

最后,您应该使用以下命令初始化此类:

my_dealer = Dealer("Bob", Deck())

仅使用不带括号的Deck会导致将类提供给经销商,而不是您想要的类实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM