Python — доступ к атрибутам класса в другом классе, который не является его дочерним

#python #oop

#питон #ооп

Вопрос:

Я работаю над домашним заданием, с которого мы начали ООП, и я не совсем уверен в этом.

Допустим, у меня есть X экземпляров класса Card, где Card является родительским классом для других подклассов, таких как type of the cards и т.д., Но в целом все они сохранены в переменных «экземплярах», например, 20 экземпляров. Что мне нужно, так это перенести 10 таких экземпляров в другой класс с именем Deck, где я создам новый список «deck» и добавлю в него эти 10 карт, после чего разделю их пополам на 2 игрока.

Моя проблема в том, что я просто не знаю, как переместить эти экземпляры с карты класса в колоду класса, а также разделить их послесловия для этих двух игроков. Спасибо за вашу помощь, надеюсь, я ясно выразился.

 class Card:

    instances = []

    def __init__(self, name):
         self.__name = name
         self.__class__.instances.append(self)

class Deck:
    
    deck = []

    def __init__(self):
         self.__class__.deck.append(Card.instances)    


class Player(Deck):
     
     def __init__(self, name, deck):
         super().__init__(deck)
         self.__name = name


def main():

     card1 = Card('Card1')
     card2 = Card('Card2')
     card3 = Card('Card3')

     p1 = Player('Tim')
     p2 = Player('Jill')

if __name__ == '__main__':
     main()     
 

Комментарии:

1. Способ, которым здесь реализована колода, представляет собой список всех карт, поэтому вы никогда не сможете иметь две разные колоды.

2. Хорошо, спасибо. Итак, как это сделать?

3. Я не уверен, что вам даже нужен Deck класс. Похоже, что простой список карточек будет работать нормально.

4. Кроме того, почему вы наследуете класс Player от класса Deck? Это означает, что игрок — это колода, что кажется странным. Я думаю, имеет смысл сказать, что у игрока есть колода (т. Е. композиция), а не то, что игрок является колодой (т. Е. наследование).

5. Хорошо, но в любом случае. Если у меня будет этот список, как я собираюсь разделить его для этих двух игроков?

Ответ №1:

Итак, прежде всего, вы реализовали Deck так, чтобы он содержал список всех Cards . Вам понадобится init колода только с ее именем (и, возможно, несколько начальных карт), а затем методы в этом классе для добавления и удаления любых других карт. Для этого вы можете использовать приведенный ниже код:

 class Deck:

    def __init__(self, init_cards=None):
        self.deck = []
        if init_cards:
            self.deck.extend(init_cards)    
    
    def add_card(self, card):
        self.deck.append(card)
    
    def withdraw_card(self, card_name):
        return_card = None
        for card in self.deck:
            if card.name == card_name:
                return_card = self.deck.remove(card)
        return return_card
 

Затем вы можете создавать колоды с их картами и передавать карты между колодами, используя функции в Deck классе. Дайте каждому игроку колоду в качестве переменной, а затем ссылайтесь на нее.

Комментарии:

1. __init__ наверное , хочет позвонить .extend(init_cards) , а не .append(init_cards) .