关于 == 运算符和 is 运算符
首先,if self.__attr is True 和 if self._attr == true 它是有区别的,这涉及到 “变量(或者说对象)的相等性”。相关的内容在书籍《流程的 Python 第二版》中有详细的论述。
如果楼主懂 C 语言指针的概念,那么相当于:== 比较的是两个指针指向的值,is 比较的是两个指针的值。
这是我之前的笔记,不知道你能否看懂。
我再举个例子:
所以楼主图片中的 if self.__attr 表达式是在判断 __attr 是否可被视为真(非 0 数值、非空字符串、非空列表、非空字典等等都被视为真),所以整个表达式相当于 if self.__attr == True 。
此时是不能使用 is True 的,否则就是在判断 __attr 是否为布尔类型的 True 。
关于代码中的 return Test2(key)
至于这个,我觉得楼主应该主动调试一下代码,跟着走完一遍处理的流程就懂了。
我简单说一说 test.a.b 的过程,楼主自己再思考一下 test.a.b.c 中访问 c 成员的过程吧:
- 首先
t2 = Test2() 时,t2.__attr 为空字符串。
- 当执行
t2.a 时,t2 自身并没有 a 成员,所以它会执行到 __getattr__ 方法,此时 t2.__attr 为空字符串,被视为假,故 t2.a 表达式的值就是该方法的返回值 Test2("a") 。
- 也就是说
t2.a.b.c 相当于 Test2("a").b.c 。这里我把临时的 Test2("a") 取名为 temp ,它的 __attr 属性为字符串 a 。
- 同理,当执行到
temp.b 时,因为 temp.__attr 为 "a" ,所以可以进入 if 语句块,得到 key 为 a.b 啦
- 最后,
temp.b 的值相当于 Test("a.b") 。整个表达式又变成了 Test("a.b").c 了。
|