V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
lhx2008
V2EX  ›  问与答

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

  •  
  •   lhx2008 · 2019-05-19 16:18:54 +08:00 · 883 次点击
    这是一个创建于 1796 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个这样的写法

    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 参数,而属于对象实例的方法并没有

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

    但是事实上是把 test_func() 这个函数“绑定”到对象上了,从优先级来说,对象作用域应该比类作用域更高,不过,Python 的解释器似乎没有对于对象作用域内的函数进行补充处理
    Wincer
        4
    Wincer  
       2019-05-19 16:54:42 +08:00 via Android
    为什么你会认为对象作用域要比类(class)的高?对象的行为是由定义的,而且我已经说过了,test_func 这个函数就是定义在 Test 这个 class 上的,你可以 dir(Test) 查看一下它的属性
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5224 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 07:20 · PVG 15:20 · LAX 00:20 · JFK 03:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.