Ошибка 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)
Не согласен с предыдущим оратором местами. 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 человек
- Название класса пишется с большой буквы и не как иначе.
- Сейчас вы пишите название класса с humans, а потом исправляете на Hemans согласное Pep8, и вызов humans.humans_count += 1 уже не работает, это плохая практика нужно писать slef.humans_count += 1. Как правильно заметил человек выше.
- И в данном случае я не вижу смысла использовать статический метод так как статический метод работает только с переданными в него отдельно аргументами, а если по выпендриваться можно использовать класс метод.