【问题标题】:Calling a method within other method definitions and 'object has no attribute'在其他方法定义中调用方法并且“对象没有属性”
【发布时间】:2018-08-19 16:00:25
【问题描述】:

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

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)

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

【问题讨论】:

    标签: python python-3.x class methods


    【解决方案1】:

    通过调用prnt()-方法,您指的是self._arr。这不是你的Hive-object,它有number()-method。它只是一个列表。列表没有number() 属性。您编写脚本的方式只能在Hive-object 本身上调用number()-method:self.number(),而不是self._arr.number()

    这适用于rate()-method 和prnt()-method:

    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")
    

    您提供的第二个变体无法工作,因为您在 Hive-object 上使用了 number()-method,它不再具有定义的属性 number(),因为您将其外包。但是你现在可以像这样使用它:

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

    【讨论】:

    • 哇,非常感谢!第一个变种确实困扰了我一段时间。
    猜你喜欢
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2020-05-13
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    相关资源
    最近更新 更多