Python 在其他方法定义和';对象没有属性';

Python 在其他方法定义和';对象没有属性';,python,python-3.x,class,methods,Python,Python 3.x,Class,Methods,为了练习,我一直在利用类来解决问题,但是在调用类中定义的方法时遇到了问题,在同一个类的方法定义中 class Hive: def __init__(self, arr): self._arr = arr self._index = ['Re','Pt','Cc','Ea','Tb','Cm','Ex'] self._number = [0] * 7 self._ratio = [] self._len =

为了练习,我一直在利用类来解决问题,但是在调用类中定义的方法时遇到了问题,在同一个类的方法定义中

class Hive:
    def __init__(self, arr):
        self._arr = arr
        self._index = ['Re','Pt','Cc','Ea','Tb','Cm','Ex']
        self._number = [0] * 7
        self._ratio = [] 
        self._len = len(self._arr)

    def number(self):
        for i in range(7):
            for j in range(self._len):
                if self._index[i] == self._arr[j]:
                    self._number[i] += 1

        return self._number

    def rate(self):
        population = self._arr.number()
        for x in range(7):
            self._ratio.append(population[x] / self._len)

        return self._ratio

    def prnt(self):
        population2= self._arr.number()
        rate2 = self._arr.rate()
        for k in range(7):
            print("%s %d %.2f" % (self._index[k], population2[k], rate2[k]))
        print("Total", str(self._len), "1.00")

arr = input().split()
Colony = Hive(arr)
Colony.prnt()
这将导致一个错误,该错误声明如下:

 Traceback (most recent call last):
  File "inee.py", line 33, in <module>
    Colony.prnt()
  File "inee.py", line 25, in prnt
    population2= self._arr.number()
AttributeError: 'list' object has no attribute 'number'
这产生了我想要的结果,但是第一个有什么问题吗?这不是在类的方法定义中调用方法的正确方法吗?

通过调用
prnt()
-method,您指的是
self.\u arr
。这不是具有
number()
-方法的
Hive
-对象。这只是一个列表。列表没有
number()
属性。按照编写脚本的方式,您只能调用
Hive
-对象本身上的
number()
-方法:
self.number()
,而不是
self.\u arr.number()

这对
rate()
-方法和
prnt()
-方法计算:

def rate(self):
    population = self.number()  # <-- here
    for x in range(7):
        self._ratio.append(population[x] / self._len)

    return self._ratio

def prnt(self):
    population2 = self.number()  # <-- here
    rate2 = self.rate()  # <-- and here
    for k in range(7):
        print("%s %d %.2f" % (self._index[k], population2[k], rate2[k]))
    print("Total", str(self._len), "1.00")

哇,非常感谢!第一种变体确实困扰了我一段时间。
def rate(self):
    population = self.number()  # <-- here
    for x in range(7):
        self._ratio.append(population[x] / self._len)

    return self._ratio

def prnt(self):
    population2 = self.number()  # <-- here
    rate2 = self.rate()  # <-- and here
    for k in range(7):
        print("%s %d %.2f" % (self._index[k], population2[k], rate2[k]))
    print("Total", str(self._len), "1.00")
>>> arr = ["This", "is", "a", "test", "Re", "Cc", "Tb"]
>>> initial = Hive(arr)
>>> population = number(initial)
>>> print(population)
[1, 0, 1, 0, 1, 0, 0]