类继承与print/_str_()方法

0 投票
3 回答
505 浏览
提问于 2025-04-17 10:11

再次为提问一个非常基础的问题而感到抱歉。出于某种原因,我还没有能够顺利地从Java转到Python。我知道Python有一些内置的方法,可以帮助用户完成各种操作。但我想知道下面这两段代码是否是一样的,或者说其中一个在Java中使用得更普遍,更“正式”。

def print()
    print "My name is___"

还有

def _str_()
   print "My name is___"

再说一次,我的任何一个方法可能都是完全错误的(我猜可能是“str”的方法)。为了节省时间,我没有写出类名和其他方法/属性。提前感谢大家的帮助。

3 个回答

0

这些方法的目标都是合理的(语法上没什么问题),但选择哪个方法取决于你想要做什么。

也许一个简单的例子能帮助你更清楚地理解。

我们先定义一个 User 类:

class User:

    def __init__(self, name):
        self.name = name

    def __str__(self):
        return "My name is %s" % self.name

    def show(self):
        print "My name is %s" % self.name

注意:我把方法名从 print 改成了 show,因为在 Python 2.x 中 print 是一个关键字,所以不能使用它。

现在我们来试试 User 类,看看 __str__show 之间的区别:

>>> rik = User('Ricky')
>>> rik.show()
My name is Ricky
>>> rik.__str__()
'My name is Ricky'
>>> print rik
My name is Ricky

代码应该能自我解释。

__str__ (这里是文档)

__str__ 是一个 特殊的方法名,这意味着当你调用 print rik 时,Python 会去查找 rik.__str__,如果这个方法被定义了,就会调用 rik.__str__(),并打印它返回的字符串。

__str__ 的主要要点:

  • 不应该 调用 print
  • 并且必须 返回一个 string(字符串)。

show

另一方面,直接调用 show() 会打印字符串(并返回 None)。就这样。

2

__str____len____contains__等是一些协议

任何以__xxx__形式出现的东西都有特别的含义,经验丰富的Python程序员会期待xxx(obj1)实际上是调用obj1.__xxx__()

不过,有时候这些协议会和关键词一起使用:

  • 'a' in 'aaaaa'其实是等于'aaaa'.__contains__('a')的意思。

  • print obj1实际上是等于print obj1.__str__()

即使这些特殊的(横向)含义存在,它们的实现方式和其他方法一样,所以子类可以重写这些方法。

4

你不应该自己定义 print,因为它是一个关键字或者内置函数。

__str__ 这个函数是在类里面用的。当一个对象的实例被转换成字符串时,这个函数就会被调用。像 print 这样的函数在内部会自动处理这个转换。你也可以直接用 str(my_object_instance) 来调用。

注意有两个下划线。 一个下划线,比如在提问者那里,就没什么特别的意思。


示例(Python 交互式环境):

>>> class A:                                                                                        
...   def __str__(self):                                                                            
...     return "I am an instance of A"                                                              
...                                                                                                 
>>> a_inst = A()                                                                                    
>>> print a_inst                                                                                    
I am an instance of A                                                                               
>>>  

如果你有任何问题,可以留言。

撰写回答