Вам нужен параметр self
в методе, когда метод вызывается для экземпляра класса.
Однако вы не вызываете метод для экземпляра, вы вызываете его для сам класс. Это:
sparrow = bird
print(sparrow.speak())
То же самое, что и просто:
print(bird.speak())
sparrow = bird
по сути только что создал второе имя для класса bird
. Это не создает экземпляр.
При вызове метода для класса никакие аргументы не передаются неявно, поэтому self
не требуется.