在类中使用几种方法

时间:2017-12-14 11:08:36

标签: python

目前,如果我输入x = Matrix([[5, 4], [3, 8]]),则会调用__str__。如何使用此输入调用另一个方法?

class Matrix(object):
    def __init__(self, matrix = 0):
        self.matrix = matrix

    def __Matrix__(self):
        return 10

    def __str__(self):
        return "\\n".join(["\\t".join
                       (["%d" % k for k in row]) for row in self.matrix])

如果我的输入是x = Matrix([[5, 4], [3, 8]]),如何告诉程序调用方法__Matrix__?它目前正在调用__str__

我试图制作一种方法" Matrix"在课堂内" Matrix",但程序没有改变,它继续使用__str__方法。

2 个答案:

答案 0 :(得分:1)

Python无法知道它应该使用您的__Matrix__方法来打印Matrix实例。处理special method names的方式是内部语言功能,您只需添加新的特殊方法名称或更改现有方法的处理方式,而无需修改Python源代码并编译自己的版本。除非你真的需要,否则通常不是一个好主意。 ;)

正如我上面提到的,__str__应该返回一个适合向用户显示的字符串,因此返回包含'\\t'的序列可能不是一个好主意。和'\\n'通过__str__。我想你可以通过__repr__返回它,但这仍然有点奇怪,恕我直言。我强烈建议您为其命名,例如esc_str

为了好玩,我为您的课程实施了一个相对简单的__format__方法。这个特殊方法由format内置函数和str.format方法调用。它也会被新的f-string语法调用。

我的__format__方法确定矩阵每列所需的最小宽度,您可以提供数字format_spec来设置所有列的最小宽度。添加了一个额外的空间来阻止一起运行的列。您可以增强此方法来处理初始''或者'<&#;在format_spec中表示对齐。

class Matrix(object):
    def __init__(self, matrix = 0):
        self.matrix = matrix

    def __format__(self, minwidth):
        minwidth = int(minwidth) if minwidth else 0
        # Find maximum width of each column
        widths = [max(len(str(k)) for k in col) for col in zip(*self.matrix)]
        widths = [max(minwidth, u) for u in widths]
        result = []
        for row in self.matrix:
            result.append(" ".join(["%*d" % t for t in zip(widths, row)]))
        return "\n".join(result)

    def __repr__(self):
        return "Matrix(%s)" % self.matrix

    def __str__(self):
        return "\n".join(["\t".join(["%d" % k for k in row]) 
            for row in self.matrix])

    def esc_str(self):
        return r"\n".join([r"\t".join(["%d" % k for k in row]) 
            for row in self.matrix])

# test

m = Matrix([[1, 2, 3], [5, 4, 16], [9, 867, 0]])
print(repr(m))
print(m)
print(m.esc_str())
print('Matrix\n{:2}'.format(m))
print(f'Matrix\n{m}')

<强>输出

Matrix([[1, 2, 3], [5, 4, 16], [9, 867, 0]])
1       2       3
5       4       16
9       867     0
1\t2\t3\n5\t4\t16\n9\t867\t0
Matrix
 1   2  3
 5   4 16
 9 867  0
Matrix
1   2  3
5   4 16
9 867  0

答案 1 :(得分:0)

你可以调用函数

print(x.__Matrix__())

它应该有效 如果您只是打印对象,它会自动调用内置函数 str