为什么在'类'中显示没有定义变量
>>> class Counter:def __init__(self):
self.counter = 0
def __setattr__(self, name, value):
self.counter += 1
super().__setattr__(name, value)
def __delattr__(self, name):
self.counter -= 1
super().__delattr__(name)
显示我没有定义counter这个变量为什么呀? 错误信息贴出来 但是小甲鱼的又可以
>>> class Counter:
k = []
def __init__(self):
self.counter = 0
def __setattr__(self, name, value):
if name != 'counter':
if name not in self.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) 永恒的蓝色梦想 发表于 2020-3-20 23:00
错误信息贴出来
>>> A = Counter()
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
A = Counter()
File "C:/Users/63265/AppData/Local/Programs/Python/Python38-32/CHAPTER-45动动手1.py", line 4, in __init__
self.counter = 0
File "C:/Users/63265/AppData/Local/Programs/Python/Python38-32/CHAPTER-45动动手1.py", line 7, in __setattr__
self.counter += 1
AttributeError: 'Counter' object has no attribute 'counter' Jakcy 发表于 2020-3-20 23:05
>>> A = Counter()
Traceback (most recent call last):
File "", line 1, in
改好了class Counter:
def __init__(self):
super().__setattr__('counter',0)
def __setattr__(self, name, value):
self.counter += 1
super().__setattr__(name, value)
def __delattr__(self, name):
self.counter -= 1
super().__delattr__(name) 永恒的蓝色梦想 发表于 2020-3-20 23:13
改好了
谢谢老哥,可是我想问一下我跟小甲鱼的代码就差了个 if name != counter 为什么就差了这么多呀? 永恒的蓝色梦想 发表于 2020-3-20 23:13
改好了
class Counter:
k = []
def __init__(self):
self.counter = 0
def __setattr__(self, name, value):
if name != 'counter':
if name not in self.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) Jakcy 发表于 2020-3-20 23:14
谢谢老哥,可是我想问一下我跟小甲鱼的代码就差了个 if name != counter 为什么就差了这么多呀?
先不要管小甲鱼的代码,我们先看你的代码第四行
self.counter = 0
这个时候就会调用Counter的__setattr__方法
在__setattr__方法中就会有一句self.counter += 1
然而此时self.counter还没被定义完,访问就会报错
所以我们要用super()的__setattr__来放置counter,这样Counter.__setattr__就不会运行,也不会报错了 永恒的蓝色梦想 发表于 2020-3-20 23:18
先不要管小甲鱼的代码,我们先看你的代码第四行
这个时候就会调用Counter的__setattr__方法
感谢!我明白了!谢谢老哥,小甲鱼的我也知道了!因为他有if。。
页:
[1]