首页 > 解决方案 > 如何在python中命名和创建一个类的多个实例?

问题描述

我是编程和学习 OOP 的新手。我想创建一副扑克牌,所以我创建了一个名为 Card 的类,它有一个数字属性和一个花色属性。然后我想创建一个包含该类的 52 个实例的列表来制作卡片组。我还希望它们中的每一个都被命名为“2_spades”、“3_spades”、“4_spades”等,但显然不想手动进行。

当我使用 for 循环创建列表并打印列表时,它打印了实例的内存位置,这是可以理解的,因为我没有命名实例。所以我尝试将 str dunder 方法添加到类中,该方法返回实例的编号和套装。但它没有用。

class Card:
    def __init__(self, number, suit, trump='not the trump'):
        self.number = number
        self.suit = suit
        self.trump = trump

    def make_trump(self):
        self.trump = 'the trump'

    def remove_trump(self):
        self.trump = 'not the trump'

    def __str__(self):
        return f'{self.number} of {self.suit}'


suits = ['spades', 'hearts', 'clubs', 'diamonds']
deck = []
for Suit in suits:
    for i in range(13):
        deck.append(Card(i. Suit))

print(deck)

当我打印甲板时,它会为每个人提供内存位置。

我如何创建类 Card 的多个实例并用它们的 number_suit 或 self.number_self.suit 命名每个实例?

标签: pythonpython-3.xclassinstance

解决方案


如果你打印一个本身打印的list东西,list它的元素使用repr(element)

class Card: 
    def __init__(self, number, suit, trump='not the trump'):
        self.number = number
        self.suit = suit
        self.trump = trump

    def make_trump(self):
        self.trump = 'the trump'

    def remove_trump(self):
        self.trump = 'not the trump'

    def __str__(self):
        return f'{self.number} of {self.suit}'

    # provide the __repr__ method to be the same as str so iterables
    # when printing this will not print the memory adress but the more
    # meaningfull representation
    def __repr__(self):
        return str(self)   # same as str

应该做的伎俩

然后你可以简单地

suits = ['spades', 'hearts', 'clubs', 'diamonds']
deck = []
for Suit in suits:
    for i in range(13):
        deck.append(Card(i, Suit))   # fix this

print(deck)

输出:

[0 of spades, 1 of spades, 2 of spades, 3 of spades, 4 of spades, 5 of spades, 
 6 of spades, 7 of spades, 8 of spades, 9 of spades, 10 of spades, 11 of spades, 
 12 of spades, 0 of hearts, 1 of hearts, 2 of hearts, 3 of hearts, 4 of hearts, 
 5 of hearts, 6 of hearts, 7 of hearts, 8 of hearts, 9 of hearts, 10 of hearts, 
 11 of hearts, 12 of hearts, 0 of clubs, 1 of clubs, 2 of clubs, 3 of clubs, 4 of clubs, 
 5 of clubs, 6 of clubs, 7 of clubs, 8 of clubs, 9 of clubs, 10 of clubs, 11 of clubs, 
 12 of clubs, 0 of diamonds, 1 of diamonds, 2 of diamonds, 3 of diamonds, 4 of diamonds, 
 5 of diamonds, 6 of diamonds, 7 of diamonds, 8 of diamonds, 9 of diamonds, 10 of diamonds, 
 11 of diamonds, 12 of diamonds]

推荐阅读