不确定如何在python中使用属性和方法

时间:2017-03-13 13:27:23

标签: python oop

我目前正在进行一项任务,在一个特定的问题中我必须拿一张扑克牌列表,并使用一个类来确定它是否是Royal Flush

讲师提供了一个代码的“骨架”,我必须在不改变他写的部分的情况下构建其余部分。

#Lecturer created...
class PokerHand(Hand):

    def __init__(self, cards = list()):
        Hand.__init__(self, cards)

        self.handRank = 0
        self.hand = "High Card"

        #I have so far added this part...
        total_value = 0
        val_card_b4 = 0
        for card in self.cards:
            if Card.getValue(card) > val_card_b4:
                total_value += Card.getValue(card)
                val_card_b4 = Card.getValue(card)
                checkRoyalFlush()
        #...to here. However it throws an error that checkRoyalFlush isn't defined.        

    #The lecturer then had what is below already added.
    def checkHand(self):

        if self.checkRoyalFlush():
            self.handRank = 9
            self.hand = "Royal Flush"
            print("Test")

我已经在之前的问题中创建了一个Card课程,允许我创建一张卡片object获取卡片的价值(A=11, 2-10 equal face value etc.

我的问题是,一旦我检查了卡片,我就不知道如何在if self.checkRoyalFlush():方法中“激活”checkHand语句。

我必须运行的代码是:

h1 = PokerHand([Card('hearts', '10'), Card('clubs', '10'),Card('hearts', '2'),Card('hearts', '3'),Card('spades', 'J')])
h1.show()
print(h1.checkHand())

我想了解如何让if语句正常工作,因为我花了很多时间研究并且无法弄明白。我只是python的初学者,也是面向对象方面的新手。

编辑:我也不知道如何定义'checkRoyalFlush'而不会出现更多错误

2 个答案:

答案 0 :(得分:1)

if语句(例如if self.checkRoyalFlush():)需要布尔数据类型,即TrueFalse。您的方法需要返回以下任一值:

#Lecturer created...
class PokerHand(Hand):

    def __init__(self, cards = list()):
        # etc...

    def checkHand(self):
        # etc...

    # add your new method below the methods that already exist
    def checkRoyalFlush(self):
        # paste your code to check if it is a royal flush here
        # if it is a royal flush, then:
            return True
        # if it is NOT a royal flush, then:
            return False

此外,您需要将您的方法称为self.checkRoyalFlush(),因为它是类PokerHand的一部分。你没有在checkHand()方法中这样做。

答案 1 :(得分:1)

看起来你的讲师想要一种名为checkRoyalFlush()的方法,如果你的手是皇家同花,我假设会返回truefalse如果不是AREN'吨

另请注意,我不知道您如何设置卡片类,而且我也不知道您所称的套装或价值属性。在下面的代码中,我为suit属性和.suit以及value属性调用.value。将其更改为您所做的任何内容。

考虑以下代码:

class PokerHand:
    def __init__(self, cards = list()):
        #your init goes here as above

    def checkHand(self):
        #checkHand as above

    def checkRoyalFlush(self):          
        check_suit = cards[0].suit   #note I don't know what you are calling the suits and values in your hand, 
        values = ['A','K','Q','J','10'] #values we want to check against
        for each_card in cards:
            if not (each_card.typing == check_suit and each_card.value in values): 
                return False
            values.remove(each_card.value) #once we found a value we want to remove it from the possible list
        return True

方法checkRoyalFlush()会从卡片列表中取出一张卡片。由于皇家同花顺必须拥有所有相同的套装,因此我选择哪张牌并不重要。在这里,我选择列表中的第一张卡片。

然后我遍历cards列表并检查每个卡片的输入是否相同,以及每个值是否在值列表中

如果一张卡与要求不符,则返回False。

我们删除了我们检查的值,因此我们可以确保它的值为1而不是重复的值。 如果完成for循环检查而没有返回False,我们知道它是皇家同花顺

请注意,这不是最佳方式,它只是一种显示如何清晰完成的方式。