点击蓝色字关注我们
最近在一个 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,不备注可是会被拒绝的哦~!