簡體   English   中英

對象列表的自定義列表表示

[英]Custom list representation for list of objects

我知道可以使用__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.lstself.lst以便我可以修改其repr。 還有其他想法嗎?

您可以存儲傳遞給列表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>

要對類實例進行分組,我們需要覆蓋eq,ne和hash函數。 通過提供靜態哈希值,會將此類的所有實例視為一個對象。

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>"]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM