Python 面向对象的一个特性,要怎么解释呢

2019-05-19 16:18:54 +08:00
 lhx2008

有一个这样的写法

class Test:

    def test_func(self):
        pass

    def __init__(self):
        self.test = Test.test_func


if __name__ == "__main__":
    t = Test()
    t.test_func() # error
    t.test()

Pycharm 已经傻掉了, 对于这段代码不会有任何错误提示,不过它运行起来是错误的

t.test()
TypeError: test_func() missing 1 required positional argument: 'self'

是不是意味着解释器只对对象所属类中的方法自动传递了一个 self 参数,而属于对象实例的方法并没有

898 次点击
所在节点    问与答
5 条回复
zwzmzd
2019-05-19 16:29:41 +08:00
bounded method 和 unbounded method 了解一下
Wincer
2019-05-19 16:43:34 +08:00
t.test_func 这里的 t 就是定义 test_func 参数里的 self,它等同于 Test.test_func(t)。
lhx2008
2019-05-19 16:50:07 +08:00
@Wincer @zwzmzd
py3 并没有 bounded 和 unbounded method,虽然在类实例调用函数的时候,3 的机制是继承 2 的

但是事实上是把 test_func() 这个函数“绑定”到对象上了,从优先级来说,对象作用域应该比类作用域更高,不过,Python 的解释器似乎没有对于对象作用域内的函数进行补充处理
Wincer
2019-05-19 16:54:42 +08:00
为什么你会认为对象作用域要比类(class)的高?对象的行为是由定义的,而且我已经说过了,test_func 这个函数就是定义在 Test 这个 class 上的,你可以 dir(Test) 查看一下它的属性
dinjufen
2019-05-20 10:16:25 +08:00

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

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

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

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

© 2021 V2EX