gonorth 发表于 2020-10-17 13:08:38

python 45课后最后一题

该题的需要实现的目的是:
>>> c = Counter()
>>> c.x = 1
>>> c.counter
1
>>> c.y = 1
>>> c.z = 1
>>> c.counter
3
>>> del c.x
>>> c.counter
2
该题的答案为:
>>> 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)
我写的是:
class Counter:
    def __init__(self):
      self.counter = 0
    def __setattr__(self, name , value):
      if name != 'counter':
            self. counter +=1
      super().__setattr__(name,value)
    def __delattr__(self,name):
      self.counter -= 1
      super().__delattr__(name)
我亲测也没啥问题,也可以实现。所以有点不懂,为何要搞个列表出来,也没看出以后可以有什么方便操作的地方,本人新手,还请各位理解一下。能否指正一下我这里的代码是否有什么隐藏问题。谢谢

hhxx,hnyq 发表于 2020-10-17 14:13:07

self.k是一个列表,他储存着实例对象的属性名,原代码中的第二个if语句就是判断有无重名
而您的代码,没有判断重名
意思就是,如果您重复设置:
c.x=1
c.x=2
此时,counter应为1,但您的代码里,counter是2
页: [1]
查看完整版本: python 45课后最后一题