如何在列表中嵌入一个类?

时间:2018-05-27 15:03:53

标签: python list oop

目前,我正在构建一个允许模拟Magic The Gathering游戏的项目,这样我就可以看到我多长时间绘制一张特定的牌以及赢得一场比赛需要多长时间 - 即让对手的生命受到影响从20到0。 我现在使用的代码使用OOP用于单个卡和单个卡座。这些被导入到主要代码中 - 该项目位于https://github.com/jimbob88/MTG的GitHub上。 Card.py:

class Card:
    """Define MTG Card"""

    def __init__(self, name, cc, supertype):
        """(Card, int, str) -> Nonetype"""
        self.name = name; self.cc = cc; self.supertype = supertype
        self.cardData = [self.name, self.cc, self.supertype]

    def __str__(self):

        card_string = super().__str__()

        return str(self.cardData)

这是一个简单的类,用于存储名称,投射成本和卡片类型。它还包含一个变量cardData,它返回一个包含名称,铸造成本和超类型的列表。然后将这些卡作为列表输入到名为Deck的类中。 Deck.py:

from random import shuffle;  import csv
class Deck:
    """Define MTG Deck"""

    def __init__(self, name, author, colour, cards):
        self.name = name; self.author = author; self.colour = colour; self.cards = cards
        self.hand = []; self.csvData = []

Deck类将此列表放入变量 - self.cards。甲板还包含甲板名称,甲板作者和甲板颜色的变量。最后,我有一个名为MTG.py的主脚本构建了它而不是运行它 - 这是我遇到问题的区域。 MTG.py:

from Deck import *; from Card import * 
dcards = []         
while True:
    #if input('End?') != 'end':
    #    continue
    #else:
    #    break
    userCardName = input('Card Name: ')
    userCC = input('Converted Mana Cost(INT): ')
    userSuperType = input('Card SuperType: ')
    userAmount = input('Amount: ')
    dcards.extend([[Card(userCardName, userCC, userSuperType).cardData(), userAmount]])
    print(str(dcards))
    end = input('End? ')
    if end == 'y':
        break
RedBurn = Deck('RedBurn','James Blackburn', 'Red',dcards)

此代码具有无限循环,询问用户卡名,投注成本,超类型以及这些卡的数量。然后它将其输入到类中 - Card(userCardName,userCC,userSuperType) - 在带有cardData的列表中。然后重复此过程直到循环中断。在此之后,它将所有用户获得的数据放入Deck类。我的问题是我的下一个开发阶段是允许转换卡以及适用于此的基本规则。基本上,每回合只能施放一块土地,如果我想施放 - 例如,一个生物 - 我必须挖掘土地类型。因此,如果要使用土地类型,则无法再次使用。直到下一个转弯。我想解决这个问题的方法是将每张卡输入为一个对象而不是一个列表,这样我就可以在这个名为isTapped的对象中有一个单独的self.variable。

dcards.extend([[Card(userCardName, userCC, userSuperType), userAmount]])

虽然这会导致卡被视为 - <Card.Card object at 0x7f8dad97f630> - 内存分配不是它的实际值。有谁知道我怎么能这样做,任何其他代码的帮助将不胜感激, 提前致谢, 詹姆斯布莱克本。

1 个答案:

答案 0 :(得分:1)

如果您打印卡片列表,列表本身将使用该元素的 repr ()打印其元素,而不是 str ():

# no __str__ 
class One():
    def __init__(self):
        pass

# self-styled __str__
class Two():
    def __init__(self):
        pass
    def __str__(self):
        return "TwoClass: Stylish aint it?"
    def __repr__(self):
        return "REPR of TwoClass: Stylish aint it?"

# Test: print both class instances    
k = [ One(), Two(), [Two()]]  # obj , obj, [obj] inside - see output for what print uses

print(*k,sep="\n\n")

输出:

<__main__.One object at 0x7fdf5df7a438>

TwoClass: Stylish aint it?

[Repr of TwoClass: Stylish aint it?]