Network programming - asynchronous, single-threaded, nickname-only chat server
Packet fragmentation

Have a read through this: https://stackoverflow.com/a/17668009/313768

usock.recv(1024) is fragile, and under many circumstances simply won't work for a handful of reasons. You'll need to do some reading about the fundamentals of TCP/IP to understand why that is, but basically, you can't assume that you'll get the data you want all in one chunk.

Context manager

You hold onto some sockets, which are resources that should be closed when you're done with them even if something goes wrong. This is a job for a context manager. You can make your class a context manager so that calling code can be sure that your resources are closed off, regardless of what else happens.

Have a read through this: https://docs.python.org/3/library/stdtypes.html#typecontextmanager

Presentation versus logic

    usock.send(b"Please, choose your username: ")


Typically, this is not done, and instead a pre-chosen number is sent over the wire, leaving the client to choose how to ask the user a particular thing. This becomes especially important when graphics get involved, or when you need to do translation/internationalization.

The first thing

[u for u in self.users if u.sock is u.sock][0].name


should be

next(u for u in self.users if u.sock is u.sock).name


That said... what on earth is this doing? When would that condition ever evaluate to False?

Type hints

PEP484 type hints, such as host: str, port: int, will clarify your function arguments.