判断一个变量是否存在为啥不能用is true嘞
在看论坛里以前有好人发的****python课,里面他讲的一段关于类的链式操作我看不懂,如果画蓝色圈的地方写的是if self.__attr is True或者==True,没错但是结果就不是这样了,难道判断存在不能加is true吗{:1_909:} 还有,为啥return是getattr的函数里的,key值却能返回到attr呢,搞不明白{:1_908:} ==用于比较两个对象的值是否相等,而is用于比较两个对象的身份是否相同,is和==的结果可能不同,因为它们可能指向不同的内存地址,但内容相同 if self.__attr就是if self.__attr == True的简写方式,Python没见过if self.__attr is True这种写法。 这是t2=Test2()
t2.a
与
Test2(‘a’)
的区别了
t2.a只是修改了内部变量key
Test2(‘a’)才是修改__attr
代码中的self.__attr不是bool值,那个if self.__attr是在判空,其应该等价于if self.__attr != None或if self.__attr is not None 本帖最后由 天下客 于 2023-11-3 17:03 编辑
rosybliss 发表于 2023-11-3 14:39
还有,为啥return是getattr的函数里的,key值却能返回到attr呢,搞不明白
因为return的值是重新实例化了一个对象,相当于t2.a == Test2('a'),这就是return的作用,所以会调用这个对象的__init__()函数,也就把这个值传给了attr 天下客 发表于 2023-11-3 16:36
代码中的不是bool值,那个是在判空,其应该等价于或
我刚试了下,其实也不等价于None,python中‘’和None不一样,还是应该老老实实地等价于if self.__attr!= ''或if self.__attr is not '' if self.__attr
其实它本意是self.__attr被赋值了,就走进if里面。
python中,非空字符串、非0数字、True等在if中都认为是“真”,所以没必要用is True 、not None来判断,也覆盖不全,判断不准,直接不用判断,底层库自己判断即可。
# 关于 == 运算符和 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` 成员的过程吧:
1. 首先 `t2 = Test2()` 时,`t2.__attr` 为空字符串。
2. 当执行 `t2.a` 时,`t2` 自身并没有 `a` 成员,所以它会执行到 `__getattr__` 方法,此时 `t2.__attr` 为空字符串,被视为假,故 `t2.a` 表达式的值就是该方法的返回值 `Test2("a")`。
3. 也就是说 `t2.a.b.c` 相当于 `Test2("a").b.c`。这里我把临时的 `Test2("a")` 取名为 `temp`,它的 `__attr` 属性为字符串 `a`。
4. 同理,当执行到 `temp.b` 时,因为 `temp.__attr` 为 `"a"`,所以可以进入 `if` 语句块,得到 `key` 为 `a.b` 啦
5. 最后,`temp.b` 的值相当于 `Test("a.b")`。整个表达式又变成了 `Test("a.b").c` 了。
页:
[1]
2