能够被这个问题吸引过来的程序员要么是准备自己开发第三方插件的,要么就是打算魔改第三方库插件的,毕竟->也就在第三方库的模块里比较常见,因此基础语法里不常见,也不常用,所以我就在这里讲一下->的用法。
起初我也是因为魔改第三方库的时候碰到了->的代码,但是我去微软浏览器的国内和国外都看了,都没找到->的用法,随后我就把拆包后的代码剪切走了一部分进行了测试,发现了一个规律。
->用于def关联class用,且关联后的def能检测到class内部的所有方法,但是调用的话就非常麻烦了,需要objeck能识别到(应该是这样),示例:
在这个示例代码里,_Device类里的coo方法是我自己后来加进去的,方便后面测验用。
这里我们就可以对connect方法进行调用,然后就是调用的时候写入connect().后会出现window_size()方法和coo()方法,回车后objcek变成connect().coo(),并且coo()下面还没有红色波浪线,但是执行的话就会报错说
AttributeError: 'NoneType' object has no attribute 'coo'
但是调用的coo方法换成window_size的话就不会提示说 方法没有coo,因为在最上面的_BaseClient加了一个参数objeck,objeck支持自己的window_size方法,但不支持咱们自己创建的coo方法,所以调用的时候用connect().window_size("hello")的话会返回这样的报错提示
AttributeError: 'str' object has no attribute 'http'
这样报错的原因是因为参数不正确。
倘若把_BaseClient里的objeck(即 类的参数)删除掉的话那么再执行的话报错结果就是
AttributeError: 'NoneType' object has no attribute 'window_size'
也就是说->的调用需要objeck的支持,下面就来说说没有->的 类 关联的话会怎样。
上面的看完了基本上都知道没有->的话def方法就没办法和其他class类进行关联,因此也无法获取/检测其他类里的方法,比如上面的示例代码,加上->的话再connect()加.会出现coo()和window_size等的选项,而没有->的话connect后面加上.也不会出现coo()和window_size的选项,只有其他函数的选项,就算手动打出来connect().coo(),那么coo()下面也会有红色波浪线,原因是因为connect方法里没能找到coo()的相关信息。