如何在 python 中命名和创建 class 的多个实例?

how to name and create multiple instances of a class in python?

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

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

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)

当我打印卡片组时,它会为每个卡片组提供内存位置。

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

如果您打印 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]