[Python-Dev] Enum: subclassing?

Antoine Pitrou solipsis at pitrou.net
Wed May 1 20:44:39 CEST 2013


On 2013年5月01日 10:21:30 -0700
Ethan Furman <ethan at stoneleaf.us> wrote:
> We may not want to /completely/ disallow subclassing. Consider:
>> --> class StrEnum(str, Enum):
> ... '''string enums for Business Basic variable names'''
> ...
> --> class Vendors(StrEnum):
> EnumError: subclassing not allowed

I don't see the point of disallowing subclassing. It sounds like
a pointless restriction.
However, perhaps the constructor should forbid the returning of a base
type, e.g.:
class Season(Enum):
 spring = 1
class MySeason(Season):
 """I look nicer than Season"""
MySeason('spring')
...
ValueError: Season.spring is not a MySeason instance
(what this means is perhaps the subclassing of non-empty enum classes
should be forbidden)
Regards
Antoine.
>>> My point is that IntEnum, StrEnum, ListEnum, FloatEnum are all "subclasses" of Enum. To then have a subclass of
> that, such as Season(StrEnum), is subclassing a subclass.
>> Now, if we do want to completely disallow it, we can ditch IntEnum and force the user to always specify the mixin
> type:
>> --> class Season(str, Enum):
> .
> .
> .
>> --> class Names(str, Enum):
> .
> .
> .
>> But that's not very user friendly... although it's not too bad, either.
>> One consequence of the way it is now (IntEnum, StrEnum, etc., are allowed) is that one can put methods and other 
> non-Enum item in a base class and then inherit from that for actual implemented Enum classes.
>> --> class StrEnum(str, Enum):
> ... def describe(self):
> ... print("Hi! I'm a %s widget!" % self.value)
> ...
>> --> class Season(StrEnum):
> ... spring = 'green'
> ... summer = 'brown'
> ... autumn = 'red'
> ... winter = 'white'
> ...
>> --> class Planet(StrEnum):
> ... mars = 'red'
> ... earth = 'blue'
> ...
>> --> Season.summer.descripbe()
> Hi! I'm a brown widget!
>> --> Planet.earth.describe()
> Hi! I'm a blue widget!
>> --
> ~Ethan~



More information about the Python-Dev mailing list

AltStyle によって変換されたページ (->オリジナル) /