自我和表演的区别

2024-04-25 04:05:34 发布

您现在位置:Python中文网/ 问答频道 /正文

刚刚遇到一个示例分数类,不太确定这两个方法之间的区别。一旦__str__被实现,show就不会变成redundent吗?

def __str__(self):
    return str(self.num)+"/"+str(self.den)

def show(self):
    print(self.num,"/",self.den)

我意识到__str__是一个魔术方法,它的实现负责处理任何需要类的字符串版本的上下文。只是看不到show(self)方法的意义?


编辑

是否显示大多数类所需的泛型方法?
我的问题是,如果我有一个分数x,那么我所需要做的就是print(x),然后我将看到1\2或者这个实例所保存的内容—那么为什么要麻烦实现一个额外的方法show


Tags: 方法self示例returndefshow魔术num
3条回答

__str__方法非常小心地确保所有内容都是一个str,因此它返回一个str

show方法依赖于print隐式地将self.numself.den转换为str。它将结果显示为副作用,并且不返回任何结果

print将在每个参数之间插入一个空格。

>>> str(3)+"/"+str(5)
'3/5'
>>> print(3,"/",5)
3 / 5

如果你不在乎额外的空间,真的没有理由不使用

def show(self):
    print(self)

也许作者认为不这样做更清楚。

当你试图创建一个子类时,这种方式分离show__str__也可能令人惊讶。如果子类重写__str__,那么您可能也会希望该更改反映在show中。

__str__是一个神奇的方法,每次将对象作为字符串处理时都会调用它,例如str(fraction_instance)

使用__str__方法的目的是创建对象的字符串表示形式。__str__应该返回字符串。如果__str__的实现代替打印字符串表示,而不返回任何内容,则当对象在字符串上下文中使用时,将引发TypeError。例如:

def __str__(self):
        print '%f/%f'%(self.num,self.den)

如果我们要显示这样的分数对象:

f = Fraction(1,2)
print f

我们有个例外:

Traceback (most recent call last):
  File "/Users/.../Desktop/...", line 13, in <module>
    print f
TypeError: __str__ returned non-string (type NoneType)
>>> 

这是因为__str__用于获取对象的字符串表示,而不是打印它(按照约定,只要返回字符串,就可以打印)。这就是print语句/函数与__str__方法一起使用的功能。

另一方面,像show这样的方法:

def show(self):
        print(self.num,"/",self.den) #or even print(self) (for the last part of answer)

在上述情况下基本上等同于print(f)(除了它包含操作数旁边的空格)。show用于输出字符串表示,而__str__用于获取表示。

但是,可以将附加逻辑添加到show中,这在构造字符串表示时是不适当/不必要的,因此使用这两种方法是有意义的。

但是,您可以使用像show这样的方法,其中print语句不合适,即:

if f.show(): pass
if print(f): pass #raise exception

相关问题 更多 >