目前,如果我输入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__
方法。
答案 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