
class Example: # 坑 cOntainer= {} def __init__(self): # do init pass def result(self): if self.container: return self.container() self.container["a"] = self._a() self.container["b"] = self._b() return self.container def _a(self): # fetch data return "a" def _b(self): # fetch data return "b" 今天用了一个这样的结构来处理部分数据.然后就出现了第二个实例返回的结果和上一个一样的情况. 反思了一下自己在写代码的时候根本没注意到这个 container 在两个实例里可能会指向同一个地址的问题.写 python 两年多一直在很小心 list 和 dict 作为参数时避免采坑,没想到今天换了个地方踩了一下,不知道别人是不是了解这个坑,发出来给大家看看吧
1 j0hnj Feb 21, 2019 这...是常识吧,楼主写两年多 Python 写的都是啥? |
2 metamask Feb 21, 2019 静态变量 不过确实有很大部分直接入 python 并不了解这个东西。 |
3 whoami9894 Feb 21, 2019 因为类变量是实例共享的,不可变类型修改时会修改实例变量,可变类型就是这种情况 return self.container() 这里多了对括号 |
4 araraloren Feb 21, 2019 可变类型? 静态变量? |
5 9hills Feb 21, 2019 via iPhone 尽量避免使用类变量,使用大写定义常量,只读不写。 类变量也有并发冲突问题。 |
6 liu19931020 Feb 21, 2019 |
7 lolizeppelin Feb 21, 2019 ....两年真白写了 我估计单例你都没写过...... |
8 Orenoid Feb 21, 2019 @liu19931020 请问这是什么书 |
9 windfarer Feb 21, 2019 via Android 我在刚入行半年的时候,就修过之前老哥留下的这样的 bug= = |
10 leoli Feb 21, 2019 这也不是楼主所说的 "可变类型的坑" 吧。这都能理解错,楼主还是要严谨点。 |
11 liu19931020 Feb 21, 2019 @Orenoid Python 基础教程(第三版) |
12 zwzmzd Feb 21, 219 via iPhone 你需要的是把 self.container 变量定义在__init__函数中,和可变类型没关系 |
13 cyspy Feb 21, 2019 兄弟估计没学过 cpp 或者 java,面向对象底子不够 |
14 huahuajun9527 Feb 21, 2019 这应该怪 类属性 跟 实例属性 没搞懂 |
15 xpresslink Feb 21, 2019 按理说两年了不应该还踩这个坑啊。再说了这个也不 可变类型的坑, 明显就是类变量和实例变量的概念和区别没弄明白。 你这个需求下创建实例变量应该把放到 init 方法中。 class Example: ◇◇◇◇def __init__(self): ◇◇◇◇◇◇◇◇# do init ◇◇◇◇◇◇◇◇self.cOntainer= {} ◇◇◇◇◇◇◇◇pass |
16 metamask Feb 21, 2019 我觉得某楼也不必这么说楼主, 这个东西,就是点与面的问题,没必要把话说绝。 |
17 zst Feb 21, 2019 via Android 老实说 Python 这个确实是个坑.......不知道设计的时候咋想的,所以一般丢到 init 里面去比较好 |
18 wangxiaoaer Feb 21, 2019 via Android 我 Python 不熟,但这个跟可变类型有啥关系啊?看起来是成员变量跟静态变量的问题。 |
19 shm7 Feb 21, 2019 via iPhone lz 从 java 来的吧; python 里面用 a, b = a(), b() 不需要写什么 pojo |
20 shm7 Feb 21, 2019 via iPhone 的确和可变类型没啥关系,恐怕 java 也没写好,静态的 class 的属性和 obj 的属性用法都是一致的。 |