python有时候没有智能提示_为什么有时候 PyCharm 没有智能提示?

点击蓝色字关注我们

最近在一个 Python 技术交流群有人问了这么一个问题:为什么有时候 PyCharm 没有智能提示?其实这个问题我也碰到过,没有提示的原因也是非常简单,主要有 3 个原因:运行时改变一个类,使用 exec 函数执行某些属性或者变量初始化语句,使用 setattr 初始化属性或者变量。其实导致没有智能提示的原因有很多,有些太复杂了我就不讲了!

运行时改变一个类

运行时改变一个类?还有这种操作?在 Python 中,还真有这种操作。不信可以看一下下面这段代码。

class A: a = 'a'if __name__ == '__main__': A.b = 'b' print(A.a, A.b)

运行结果如图所示。

可以发现并没有报错,而是在运行时给类添加一个属性 b 并用 'b' 初始化。

这就有人会问了,这和今天的问题有什么关系?其实是有关系的,不信看图。

我们都知道,Python 一切皆对象,包括类也是对象,既然是对象,用一个或者多个变量指向它当然没问题!在这里通过运行时修改指向 A 的变量 A0 来修改 A 这个类,也就是通过 A0.b = 'b' 这一语句给 A 添加一个属性 b 并用 'b' 初始化。但是,当我们想通过 A 来召唤属性 b 发现智能提示没出现这个属性。但是 A.b 是不会报错的,而且 A.b == 'b' 是 True。为什么会这样?因为 Python 是运行时才会识别类型!只要代码不运行,解释器永远不知道 A0 就是 A,所以没有智能提示是正常的!

使用 exec 函数执行某些属性或者变量初始化语句

exec 函数需要一个必选参数,这个参数是一个字符串,这个函数的功能是执行字符串中的代码,和今天的问题同样有关系,不信看图。

在构造方法 __init__ 中,属性 b 我通过调用 exec 函数来初始化,在下面我想用 A 类的实例 a 召唤属性 b 却发现智能提示还是没有 b,至于为什么?因为 exec 函数是运行时才执行的!如果没运行,解释器根本不知道 A 的实例有属性 b,这种情况没有智能提示很正常!

使用 setattr 初始化属性或者变量

setattr 用于给一个对象设置属性,需要 3 个参数:对象,属性名(字符串类型),属性值!

在构造函数中,我通过调用 setattr 来设置 A 的实例属性 b,但是在下面我想通过 A 的实例 a 召唤属性 b,依旧没有召唤出来,为什么?因为 setattr 是运行时才会执行!如果没运行,解释器根本不知道 A 的实例有属性 b,这种情况没有智能提示很正常!

其实没有智能提示的原因还有很多,比如使用元类(可以运行时修改一个类)……在这里我就不一一讲解了,最重要的就是记住 3 个字:运行时!

今天的文章有不懂的可以后台回复“加群”,备注:小陈学Python,不备注可是会被拒绝的哦~!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值