类继承与print/_str_()方法
再次为提问一个非常基础的问题而感到抱歉。出于某种原因,我还没有能够顺利地从Java转到Python。我知道Python有一些内置的方法,可以帮助用户完成各种操作。但我想知道下面这两段代码是否是一样的,或者说其中一个在Java中使用得更普遍,更“正式”。
def print()
print "My name is___"
还有
def _str_()
print "My name is___"
再说一次,我的任何一个方法可能都是完全错误的(我猜可能是“str”的方法)。为了节省时间,我没有写出类名和其他方法/属性。提前感谢大家的帮助。
3 个回答
这些方法的目标都是合理的(语法上没什么问题),但选择哪个方法取决于你想要做什么。
也许一个简单的例子能帮助你更清楚地理解。
我们先定义一个 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
)。就这样。
__str__
、__len__
、__contains__
等是一些协议。
任何以__xxx__
形式出现的东西都有特别的含义,经验丰富的Python程序员会期待xxx(obj1)
实际上是调用obj1.__xxx__()
。
不过,有时候这些协议会和关键词一起使用:
'a' in 'aaaaa'
其实是等于'aaaa'.__contains__('a')
的意思。print obj1
实际上是等于print obj1.__str__()
。
即使这些特殊的(横向)含义存在,它们的实现方式和其他方法一样,所以子类可以重写这些方法。
你不应该自己定义 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
>>>
如果你有任何问题,可以留言。