The OOP pattern dfox is referring to would look something like this:
class AbstractChoice:
# defines all common operations on choices
# plus potentially some useful stuff on top of those
pass
class Good(AbstractChoice):
# conatins the code specific to good things
pass
class Bad(AbstractChoice):
pass
class Ugly(AbstractChoice):
pass
This isn't a straight-on replacement though. It's especially bad when you want to separate your concerns not along the good-bad-ugly-axis but something different (which is when you'd e.g. go on to use mixins, or that ugly visitor pattern we've seen in the OP).