- Single letter names are not readable in general. `i`, `p` and `q`, for example, would be easier to read as `identification`, `price`, and `quantity`. This is also a common pattern, where parameters to be stored as fields are named the same as the fields.
- The last three lines should be in a `main` function, called `if __name__ == '__main__'`.
- `item_dictionary` would be better expressed either by making `Product` a `dict` subtype or making an `as_dict` method.