Пользовательское представление списка для списка объектов - PullRequest
0 голосов
/ 20 февраля 2019

Я знаю, что представление объекта можно настроить с помощью магического метода __repr__.

class A:

    ...

    def __repr__(self):
        return 'A(id={})'.format(self.id)

Есть ли способ настроить представление, когда оно представляет собой список этих объектов, такой, что ононе просто печатать список представления объекта [A(id=1), A(id=10), A(id=11)].

Например:

class AGroup:
    def __init__(self, lst):
        self.lst = lst

>>> lst = [A(1), A(10), A(11)]
>>> grp = AGroup(lst)
>>> grp.lst
<Group of 3 A's>  # instead of [A(id=1), A(id=10), A(id=11)]

Я думал об упаковке списка в другой объект, прежде чем присвоить self.lst такчто я могу изменить его repr.Любая другая идея?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

, чтобы сгруппировать экземпляр класса, нам нужно переписать eq, ne и hash function.давая статическое значение хеша, мы будем рассматривать все экземпляры этого класса как один объект.

from collections import Counter
class A:
    def __init__(self , id):
        self.id = id
    def __hash__(self): return hash('A')
    def __eq__(self, x): return type(x) is A
    def __ne__(self, x): return type(x) is not A

    def __repr__(self):
        return 'A'


class B:
    def __init__(self , id):
        self.id = id
    def __hash__(self): return hash('B')
    def __eq__(self, x): return type(x) is B
    def __ne__(self, x): return type(x) is not B

    def __repr__(self):
        return 'B'


class AGroup:
    def __init__(self, lst):
        count = Counter(lst)
        self.lst = []
        for cl in Counter(lst):
            self.lst.append('<Group of {} {}\'s>'.format(count[cl] , cl))



lst = [A(1), B(10), A(11)]
grp = AGroup(lst)
grp.lst


["<Group of 2 A's>", "<Group of 1 B's>"]
0 голосов
/ 20 февраля 2019

Вы можете сохранить список, переданный конструктору AGroup, в экземпляре подкласса list, чтобы можно было переопределить метод __repr__ подкласса list для возврата выводав желаемом формате:

class A:
    def __init__(self, id):
        self.id = id
    def __repr__(self):
        return 'A(id={})'.format(self.id)

class AGroup:
    class AList(list):
        def __repr__(self):
            return "<Group of %d A's>" % len(self)

    def __init__(self, lst):
        self.lst = self.AList(lst)

lst = [A(1), A(10), A(11)]
grp = AGroup(lst)
print(grp.lst)

Это выводит:

<Group of 3 A's>
...