关于方法和函数的问题

2015-11-23 12:33:54 +08:00
 MyLeoWind
为什么"hello".upper()和 str.upper("hello")的结果是一样的呢?为什么我可以这么用?
2629 次点击
所在节点    Python
11 条回复
ruoyu0088
2015-11-23 12:47:28 +08:00
你用的是 Python2 还是 Python3?
MyLeoWind
2015-11-23 12:48:18 +08:00
@ruoyu0088 是 python3
ruoyu0088
2015-11-23 12:55:54 +08:00
先不说 str 这种内置类型,例如如果你自己定义了一个类 A ,它有一个方法 func1(self), func1 实际上就是一个普通的函数保存在 A.__dict__中,如果你运行 A.func1 就得到这个函数,然后 A.func1(...),就调用这个函数。其第一个参数可以是任何对象,甚至不需要是 A 的实例。

在 Python 中函数定义了__get__方法,当你调用 a.func1 时,实际上得到的是调用 func1.__get__的返回值,它是一个 bound method 对象,该对象的__func__,__self__属性分别保存 A.func1 对象和 A 的实例 a ,而调用该对象时就会运行 A.func1(a)。
rebornix
2015-11-23 12:58:40 +08:00
https://hg.python.org/cpython/file/tip/Lib/string.py#l231

def upper(s):
"""upper(s) -> string

Return a copy of the string s converted to uppercase.

"""
return s.upper()

str.upper("hello") 的实现可不就是 "hello".upper() 么
knightdf
2015-11-23 13:01:54 +08:00
你应该知道有种东西叫 self
ruoyu0088
2015-11-23 13:02:07 +08:00
@rebornix string.upper 是 string 模块中定义的 upper 函数,和楼主的问题无关。
Frapples
2015-11-23 15:47:01 +08:00
还记得在定义方法时需要显示声明 self 参数吗?"hello".upper()这样写 python 会帮你隐式的传递 self 参数,和 str.upper("hello")效果是一样的,但是写成 "hello".upper()更有“感觉”,这种写法其实是一种语法糖。
Frapples
2015-11-23 15:49:05 +08:00
上面打字打错了,显示->显式,抱歉。
hbkdsm
2015-11-23 17:31:48 +08:00
Ruby 大法好,压根就没有函数,全是方法
MyLeoWind
2015-11-23 20:02:54 +08:00
@ruoyu0088
@Frapples
感谢解答,我好像明白了。所以
MyLeoWind
2015-11-23 20:05:26 +08:00
@ruoyu0088
@Frapples
感谢解答,我好像明白了。所以教程里说的方法的第一个参数 self 是自动指向这个实例本身是这样一个意思啊。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/238217

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX