布莱克先生 发表于 2020-7-31 21:56:56

鱼友们,这里为什么会出错呢?

这道题是想统计传入的参数有多少个,然后我就用两种做法来做,代码如下:

1.
class Sum:
    def __init__(self,*arg):
      self.len = len(arg)
      if self.len == 0 :
            print("并没有传入参数")
      else:
            print("传入了%d个参数,分别是:"%self.len,end="")
            for i in arg:
                print("%d "%i,end="")

2.
class Sum:
    total = 0
    def __init__(self,*argv):
      self.List = list()
      for i in argv:
            self.List.append(i)
      if Sum.total==0:
            print("并没有传入参数")
      else:
            print("传入了%d个参数,分别是:"%Sum.total,end="")
            for i in argv:
                print("%d "%i,end="")
    def __getattribute__(self,total):
      Sum.total += 1

但是第二种会产生错误,为什么呢?
AttributeError: 'NoneType' object has no attribute 'append'

永恒的蓝色梦想 发表于 2020-7-31 22:15:30

class Sum:
    def __init__(self,*argv):
      self.total = 0
      self.List = list()

      for i in argv:
            self.List.append(i)
            self.total += 1

      if self.total==0:
            print("并没有传入参数")
      else:
            print("传入了%d个参数,分别是:"%self.total,end="")
            for i in argv:
                print("%d "%i,end="")

全能小乌贼 发表于 2020-8-1 02:51:27

本帖最后由 全能小乌贼 于 2020-8-11 22:33 编辑

个人认为这个是因为你的__getattribute__函数中没有返回值,所以程序在初始化运行self.List = list()时进入到调用__getattribute__函数执行完成Sum.total += 1后返回了一个空值,从而使得实际上self.List = list()的列表定义变成了self.List = None的定义,最后就造成了AttributeError: 'NoneType' object has no attribute 'append'的错误。
解决方法:给你的__getattribute__函数末尾加上return object.__getattribute__(self, total),亲测有效!!!
最后,have a nice day! 一起加油学习啊!
完整代码如下:

class Sum(object):
    total = 0
    def __init__(self, *argv):
      self.List = []
      for i in argv:
            self.List.append(i)
      if Sum.total == 0:
            print("并没有传入参数")
      else:
            print("传入了%d个参数,分别是:" % Sum.total, end="")
      for i in argv:
            print("%d " % i, end="")

    def __getattribute__(self, total):
            Sum.total += 1
            return object.__getattribute__(self, total)


main = Sum(111)

Twilight6 发表于 2020-8-1 08:47:03




为什么第二种会产生错误呢?

因为你 __getattribute__ 函数是用来获取属性,而你将这个函数没有设置怎么获取类中的属性,而你self.List.append(i) 的时候是会自动调用 __getattribute__函数来获取 self.List 这个属性

而你重写了 __getattribute__ 而且没有设置返回值,导致你访问类中的属性时候返回的值为 None

而 None 没有列表的这种函数方法 append ,导致报错,所以你只需要在你 __getattribute__ 调用下父类方法即可,代码如下:


class Sum:
    total = 0
    def __init__(self,*argv):
      self.List = list()
      for i in argv:
            self.List.append(i)
      if Sum.total==0:
            print("并没有传入参数")
      else:
            print("传入了%d个参数,分别是:"%Sum.total,end="")
            for i in argv:
                print("%d "%i,end="")
    def __getattribute__(self,total):
      Sum.total += 1
      return super().__getattribute__(total)# 这里调用父类的 __getattribute__ 方法即可正常运行
a = Sum(1,2,3,4,5)

输出结果:传入了5个参数,分别是:1 2 3 4 5



页: [1]
查看完整版本: 鱼友们,这里为什么会出错呢?