Python attributes without boilerplate