【问题标题】:How to wrap several printed values by defined symbol in __repr__()?如何通过 __repr__() 中定义的符号包装多个打印值?
【发布时间】:2016-10-25 13:30:38
【问题描述】:

有一个新课程。每个实例都包含对下一个实例的引用。 目标是构建__repr__(self) 函数,当每个值都由定义的符号包裹时,它表示具有所有引用元素的类元素。例如#*。 像这样的:

******  ******  ******
* 10 *  * 20 *  * 30 *
******  ******  ****** 

有一个例子:

class Node:
        def __init__(self, value):
            self.value = value
            self.pointer = None

@pointer.setter
        def pointer(self, next_node):
            self.pointer = next_node


p1 = Node(10)
p2 = Node(20)
p3 = Node(30)

p1.pointer = p2
p2.pointer = p3

print (p1)

我所做的:

def __str__(self):
    ans = "{1} {0} {1}".format(self.value, "*")
    wrap = "{0:{1}^{2}}".format("", "*", len(ans))
    return "{1}\n* {0} *\n{1}".format(ans, wrap)

但它只适用于一个元素。 为了打印所有引用的元素,我编写了另一个函数:

def show(self):
        buf = self
        while buf.value:
            print(buf)
            if buf.pointer:
                buf = buf.pointer
            else:
                break

但它会将每个元素打印在新行上。像这样:

******
* 10 *
******
******
* 20 *
******
******
* 30 *
******

问题是我不知道如何在第一行返回一些缩进并打印接下来的 3 行元素。

问题:

有没有办法构建__repr__() 函数来表示所有引用的元素?

【问题讨论】:

  • 您是否将end = ' ' 放入所有打印报表中?
  • 我应该在哪里输入该代码?我使用内置函数str(self): 来表示每个元素。我是通过.format 函数实现的。当我进行打印时,此功能同时打印 3 行。如何将 str 函数更改为打印命令?

标签: class python-3.x oop printing


【解决方案1】:

这就是我所做的... 请原谅我写了这么多的代码。我只是 python 的新手。

我通过.format() 函数解决了它。并在输出处打印 3 行。 但我仍然等待并希望有更优雅的解决方案...
还可以选择更改print_linked_list 函数中的换行符。它只打印以下 5 个值。

def __repr__(self):
        return self.print_linked_list()
    __str__ = __repr__

    def print_linked_list(self, border="*", count=5):

        # examples of printing:
        # *****    ******    *******    ******    *****
        # * 3 * -> * 80 * -> * 100 * -> * 20 * -> * 8 *
        # *****    ******    *******    ******    *****
        ar = " -> "
        wrap, ans_string = str(), str()
        buf = self
        while buf and count >= 0:
            ans = "{0} {1} {0}".format(border, buf.value)
            ans_string += ans + (ar if buf.next else "")
            wrap += "{0:{1}<{2}}".format("", border, len(ans)) + \
                    "{:^{}}".format("", len(ar))
            buf = buf.next if buf.next else False
            count -= 1
        return "\n{0}\n{1}\n{0}".format(wrap, ans_string)

【讨论】:

    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 2016-01-19
    • 2013-01-12
    • 2011-11-23
    • 2021-07-15
    相关资源
    最近更新 更多