|
楼主 |
发表于 2020-3-30 21:52:13
|
显示全部楼层
本帖最后由 两仪shiki 于 2020-3-30 21:54 编辑
类属性数据类型是否可变的问题,小甲鱼并没有注意到:
例如,旧版python课程45讲,最后一道动手题:
修改上边【测试题】第 4 题,使之可以正常运行:编写一个 Counter 类,
用于实时检测对象有多少个属性。
这是小甲鱼给出来的答案:
class Counter:
k =[]
def __init__(self):
self.counter = 0
def __setattr__(self,name,value):
if name != 'counter':
if name not in self.k:#实例中没有找到k属性,在类属性的中找到了k
self.counter += 1
self.k.append(name)#由于类属性是可变数据类型,所以类属性遭到了修改
super().__setattr__(name,value)
def __delattr__(self,name):
self.counter -= 1
self.k.remove(name)
super().__delattr__(name)
!!!!!问题:在self.k.append(name)哪里,那里对表面上是对self.k的实例属性进行了修改,但实际上由于类属性是可变的列表数据类型,所以导致类属性也一并遭到修改。这也导致了,小甲鱼这段代码在统计不同实例的同名属性时会出错,当一个实例的属性名字与之前另一个实例的属性名字,重复时,统计函数不能被正确调用,该属性在统计时会被忽略。
例如
a = Counter()
b = Counter()
当a,b实例中都出现同名属性x时,假设a先定义x,b后定义x,你会发现b.x属性并没有被纳入统计。
|
|