Ошибка TypeError: humans() takes no arguments

Учу python по книжке "Укус питона". Там был код, похожий на мой (почти такой-же). Проблема в том, что когда я запускаю свой код, то он выдает ошибку:

Traceback (most recent call last):
  File "D:/Python/objvar.py", line 24, in <module>
    igor = humans("Игорь")
TypeError: humans() takes no arguments

Заранее благодарен, если скажите, где я ошибся/что неправильно написал. Вот код:

class humans:

    humans_count = 0

    def _init__(self, name):
        self.name = name
        print("В комнате есть {0}" .format(self.name))

        humans.humans_count += 1
    def __del__(self): #Выполняется при удалении (del)
        print("{0} вышел из комнаты" .format(self.name))

        human.humans_count -= 1

        if humans_count == 1:
            print("Остался один человек")
        elif humans == 0:
            print("В комнате не осталось людей")
    def count(self):
        print("В комнате {0} человек" .format(Humans.humans_count))

    count = staticmethod(count)

igor = humans("Игорь")
igor.count()
alex = humans("Алекс")
alex.count()

del alex
del igor

humans.count()

Ответы (3 шт):

Автор решения: Евгений

Ошибка TypeError: humans() takes no arguments вызвана неправильным объявлением конструктора класса.

Функция-конструктор обязательно должна называться __init__, и никак иначе. У вас же она называется _init__.

Кроме того, в программе есть логические ошибки и ошибки с несуществующими переменными:

  • переменная Humans в методе count не существует;

  • метод count статическим быть не должен;

  • обращение к данным объекта реализуется не через название класса (human.humans_count), а через параметр метода self (self.humans_count)

→ Ссылка
Автор решения: CrazyElf

Не согласен с предыдущим оратором местами. Count вполне можно и нужно делать статическим методом. У вас просто напутано много - human вместо humans, например, и есть обращение к переменным вообще без указания объекта/класса. Я всё исправил:

class humans:

    humans_count = 0

    def __init__(self, name):
        self.name = name
        print("В комнате есть {0}" .format(self.name))
        humans.humans_count += 1

    def __del__(self): #Выполняется при удалении (del)
        print("{0} вышел из комнаты" .format(self.name))
        humans.humans_count -= 1
        if humans.humans_count == 1:
            print("Остался один человек")
        elif humans.humans_count == 0:
            print("В комнате не осталось людей")

    def count():
        print("В комнате {0} человек" .format(humans.humans_count))


igor = humans("Игорь")
humans.count()
alex = humans("Алекс")
humans.count()

del alex
del igor

humans.count()

Вывод программы:

В комнате есть Игорь
В комнате 1 человек
В комнате есть Алекс
В комнате 2 человек
Алекс вышел из комнаты
Остался один человек
Игорь вышел из комнаты
В комнате не осталось людей
В комнате 0 человек
→ Ссылка
Автор решения: ScorpionEvil 777
  1. Название класса пишется с большой буквы и не как иначе.
  2. Сейчас вы пишите название класса с humans, а потом исправляете на Hemans согласное Pep8, и вызов humans.humans_count += 1 уже не работает, это плохая практика нужно писать slef.humans_count += 1. Как правильно заметил человек выше.
  3. И в данном случае я не вижу смысла использовать статический метод так как статический метод работает только с переданными в него отдельно аргументами, а если по выпендриваться можно использовать класс метод.
→ Ссылка