@ zero-piraeus接受的答案可以稍微扩展以允许默认参数。当你有一个大的enum,大多数条目具有相同的元素值时,这非常方便。
class Body(namedtuple('Body', "mass radius moons")):
def __new__(cls, mass, radius, moons=0):
return super().__new__(cls, mass, radius, moons)
def __getnewargs__(self):
return (self.mass, self.radius, self.moons)
class Planet(Body, Enum):
MERCURY = Body(mass=3.303e+23, radius=2.4397e6)
VENUS = Body(mass=4.869e+24, radius=6.0518e6)
EARTH = Body(5.976e+24, 3.3972e6, moons=1)
当心酸洗没有__getnewargs__
将无法正常工作。
class Foo:
def __init__(self):
self.planet = Planet.EARTH # pickle error in deepcopy
from copy import deepcopy
f1 = Foo()
f2 = deepcopy(f1) # pickle error here
非常酷。我从来没有考虑过用mixin解决问题。 – kevinarpe 2014-11-05 02:54:51
巧妙。有一个投票。 :) – 2016-03-10 00:49:40
@ZeroPiraeus:我添加了一个答案,但不是为了赏金 - 只是希望得到一些赞成票(我的[python-3.x]金徽章还有很长的路要走!)。 – 2017-03-17 07:13:12