|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
动手题的第二题
修改上边【测试题】第 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
self.counter += 1
self.k.append(name)#问题在这,这里对类属性k进行了修改,但是按照python的保护原则,实例self开头修改类属性时,应该会在实例中产生一个同名变量k代替类属性k被修改。但是结果却显示类属性k确实遭到了修改。
super().__setattr__(name,value)
def __delattr__(self,name):
self.counter -= 1
self.k.remove(name)
super().__delattr__(name)
!!!!!问题:在self.k.append(name)哪里,那里对类属性k进行了修改,但是按照python的保护原则,实例self开头修改类属性时,应该会在实例中产生一个同名变量k代替类属性k被修改。但是结果却显示类属性k确实遭到了修改。!!!!!!
例如
c = Counter()
c.x = 1
c.y = 1
c.z = 1
按道理来说类属性k应该还是为空列表
但是
Counter.k
['x', 'y', 'z']#类属性被修改了
这也导致了,小甲鱼这段代码在统计不同实例的同名属性时会出错,当一个实例的属性名字与之前另一个实例的属性名字,重复时,统计函数不能被正确调用,该属性在统计时会被忽略。
|
|