Second way is pretty clear, we almost always use this to create new object.
Once a programmer gets used to the syntax of lists, sets, dictionaries, tuples, strings, etc. Then the former is typically cleaner, since the number of characters is limited, and one can use it to immediately add elements to collections.
Also can I create another class that behaves in similar manner(first way)?
You can't. This is syntax specifically designed to work with builtin Python types. You can not - unlike some other languages - make your own "mini language". Other programming languages like for exmple Haskell allow to introduce aribtrary operators. Other languages like Prolog do not attach semantics to operators at all. In some languages, you can even introduce entire subgrammers.
In Python the language itself is quite fixed: the {} creates an (empty) dictionary, () the empty tuple, 'foo', "foo", """foo""", etc. all create strings, etc. So the interpreter has some grammar definitions that are constructed for this. You can not (easily) add extra constructs.
You could of course write some sort of interpreter (in Python) that takes as input for example a string, and thus converts this to objects of your own making. Or you could change the source code of the Python interpreter (for example CPython or IPython) and add extra grammar. But then you have technically speaking defined a new language (a superset of Python).
ipython(github.com/ipython/ipython) interpreter source code, and thus change the grammer. But then technically, the language it interprets is no longer Python.pythonas command line, the interpreter is probablyCPython.