neolee / wop-community

29 stars 19 forks source link

__init__() 函数的一点困惑 #306

Closed CHANCYstone closed 3 years ago

CHANCYstone commented 3 years ago

老师您好 image 这是我对 面向对象一节的cat 类进行了一些修改 惊讶的发现 print(cat('garfield')) 直接返回了garfield 想问下这个命名为__str__ ()为什么可以做到,而命名为_str()就不可以做到 和__init__似乎有点瓜葛?

这个想法,源自同学的一道题目,要求返回一个多项式的表示时他们老师给的答案可以直接做到 print(polynomial()) 直接返回出一个多项式表达式 image 而我自己做的时候只能做出来调用方法返回出来一个多项式的表达式的结果 后来我对答案进行操作发现 这个结果产生的原因是 方法函数命名的区别,答案采用的是内置的函数形式。

neolee commented 3 years ago

__str__()__init__() 都是 Python 的 magic methods,Python 里有很多这种用一对双下划线夹起来的名字,都是 Python 特殊定义的方法,当你实现这些方法后,Python 会自动把它们用在特定场合。比如 __init__() 会在你的对象创建出来之后自动被调用,而 __str__() 会在你的对象需要被转换为字符串(str)时自动被调用。

Python 自带的 print(x) 方法会自动把调用参数 x 转换为字符串,就是通过调用 x.__str__() 这个方法(这个方法必须返回一个字符串),如果你没有自己实现这个方法,Python 会使用自带的版本,输出类似于 oooxxx object at 0x123241124 这样的文本。