Объект класса ошибочно принят за int

avatar
khgb
9 августа 2021 в 02:58
83
2
2

Я делаю класс дерева для практики, и я пришел к этому.

class Node():
def __init__(self,val):
    self.val = val
    self.right = None
    self.left = None
    self.count = 1
def add(self,node):
    if self.val > node.val:
        if self.left == None:
            self.left = node
        else:
            self.left.add(node)
    elif self.val < node.val:
        if self.right == None:
            self.right = node
        else:
            self.right.add(node)
    else:
        self.count +=1
def count(self):
    if self.right and self.left:
        self.right.count()
        self.left.count()
    elif self.right:
        print(self.value)
        self.right.count()
    elif self.left:
        print(self.value)
        self.left.count()
    else:
        pass

Но при вызове у меня возникла проблема.

a = Node('a')
>>> a.add(Node('a'))
>>> a.add(Node('b'))
>>> a.count()
Traceback (most recent call last):
  File "<pyshell#73>", line 1, in <module>
    a.count()
TypeError: 'int' object is not callable
>>> 

>>> type(a.right)
<class '__main__.Node'>

Как это исправить? При отладке кажется, что проблема связана с функцией self.right.count(). Кроме того, я использую Python 3.9.4.

Источник

Ответы (2)

avatar
Tom Karzes
9 августа 2021 в 03:03
2

Целое число, указанное в ошибке, равно a.count. Проблема в том, что count используется классом двумя способами: (1) как имя метода и (2) как имя атрибута экземпляра.

При создании экземпляра Node метод __init__ создает атрибут экземпляра count в следующем:

    self.count = 1

Это маскирует одноименный метод. Поэтому, когда вы делаете a.count(), он использует 1 для a.count.

Чтобы это исправить, просто используйте разные имена для метода и атрибута экземпляра.

avatar
vszholobov
9 августа 2021 в 03:02
2

У вас есть поле int и метод count. Переименуйте один из них, и проблема будет решена. Также у вас есть

print(self.value)

строка, но имя вашего поля val.