Jakcy 发表于 2020-3-20 22:59:12

为什么在'类'中显示没有定义变量

>>> 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这个变量为什么呀?

永恒的蓝色梦想 发表于 2020-3-20 23:00:59

错误信息贴出来

Jakcy 发表于 2020-3-20 23:01:10

但是小甲鱼的又可以
>>> 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:05:08

永恒的蓝色梦想 发表于 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'

永恒的蓝色梦想 发表于 2020-3-20 23:13:18

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)

Jakcy 发表于 2020-3-20 23:14:25

永恒的蓝色梦想 发表于 2020-3-20 23:13
改好了

谢谢老哥,可是我想问一下我跟小甲鱼的代码就差了个 if name != counter 为什么就差了这么多呀?

Jakcy 发表于 2020-3-20 23:18:12

永恒的蓝色梦想 发表于 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)

永恒的蓝色梦想 发表于 2020-3-20 23:18:19

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__就不会运行,也不会报错了

Jakcy 发表于 2020-3-20 23:21:12

永恒的蓝色梦想 发表于 2020-3-20 23:18
先不要管小甲鱼的代码,我们先看你的代码第四行

这个时候就会调用Counter的__setattr__方法


感谢!我明白了!谢谢老哥,小甲鱼的我也知道了!因为他有if。。
页: [1]
查看完整版本: 为什么在'类'中显示没有定义变量