Python, используя другие классы __str__ методы в другом классе - PullRequest
0 голосов
/ 02 декабря 2018

Вот как используется мой класс Characters.

Консоль Python:

>>> chars = Characters()
>>> chars.add(Character("Link", "Zelda"))
>>> chars.add(Enemy("Goomba", "SMB"))
>>> chars.add(Enemy("Koopa", "SMB"))
>>> chars.games()
['Zelda' 'SMB']

>>> chars.characters("SMB")
['Koopa', 'Goomba']

Как заставить str (символы) возвращать следующее:

"Zelda:

Link from Zelda

SMB:

The Fearsome Koopa from SMB

The Fearsome Goomba from SMB"

Код моей попытки:

class Character(object):
    def __init__(self, name, game):
        self.name = name
        self.game = game
    def __str__(self):
        return "{0} from {1}".format(self.name, self.game)
    def __repr__(self):
        return "Character('{0}','{1}')".format(self.name, self.game)

class Enemy(Character):
    def __str__(self):
        return "The Fearsome {0} from {1}".format(self.name, self.game)

class Characters():
    def __init__(self):
        self.g = []
        self.c = {}
        self.p = {}
    def games(self):
        return (self.g)

    def characters(self, char_name):
        if char_name not in self.c:
            return []
        return self.c[char_name]

    def __str__(self):

        s = ""
        if not self.p:
            return s
        for x in self.p:
            s+=x+":"
            for y in self.p[x]:
                s+=" "+y+" "
        return s

    def add(self, obj):
       if not obj.game in self.g:
           self.g.append(obj.game)
       if not obj.game in self.c:
           self.c[obj.game] = [obj.name]
           self.p[obj.game] = [str(obj)]
       else:
           self.c[obj.game] += [obj.name]
           self.p[obj.game] += [str(obj)]

1 Ответ

0 голосов
/ 03 декабря 2018

Чтобы вставить новую строку в строку, используйте "\n".

Итак, это должно работать:

def __str__(self):

    s = ""
    for x in self.p:
        s += x + ":\n\n"
        for y in self.p[x]:
            s += y + "\n\n"
    return s

[Примечание: вам не нужна строка if not self.p:потому что цикл for не будет выполняться, если self.p пусто.

Есть и другие способы сделать это.

Один из способов - использовать join() и dict.items() всписок пониманий.

Попробуйте это:

def __str__(self):

    items = [
        (p + ':\n\n' + '\n\n'.join(v)) 
        for p, v in self.p.items()
    ]

    return "\n\n".join(items)

Примечание: В Python версии 2 вместо этого используйте dict.iteritems().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...