在其他方法定义和'object has no attribute'中调用方法



所以我一直在为了练习而使用类解决问题,但是在同一类的方法定义中调用类中定义的方法时遇到了麻烦

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'

因此,我可以用我目前的知识解决这个问题的唯一方法是处理方法定义之外的列表分配:

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, array):
for x in range(7):
self._ratio.append(array[x] / self._len)
return self._ratio
def prnt(self, array2, array3):
for k in range(7):
print("%s %d %.2f" % (self._index[k], array2[k], array3[k]))
print("Total", str(self._len), "1.00")
arr = input().split()
initial = Hive(arr)
population = initial.number()
rateList = initial.rate(population)
initial.prnt(population, rateList)

这产生了我想要的结果,但是第一个有什么问题呢?这不是在类中的方法定义中调用方法的正确方法吗?

> 通过 callintprnt()-method,您指的是self._arr。这不是具有number()方法的Hive对象。这只是一个列表。列表没有number()属性。你编写脚本的方式你只能在Hive对象本身上调用number()方法:self.number(),而不是self._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")

您提供的第二个变体不起作用,因为您在不再具有定义属性number()Hive对象上使用number()方法,因为您将其外包了。但是您现在可以将其用作如下所示的函数:

>>> arr = ["This", "is", "a", "test", "Re", "Cc", "Tb"]
>>> initial = Hive(arr)
>>> population = number(initial)
>>> print(population)
[1, 0, 1, 0, 1, 0, 0]

相关内容

最新更新