<p>最优雅的解决方案(IMHO)是使用mixins/基类来提供正确的行为。</p>
<ul>
<li>基类提供所有公共实现所需的行为,例如<code>Satellite</code>和<code>Planet</code>。</li>
<li><a href="https://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful">mixins are interesting</a>如果决定提供可选行为(例如,<code>Satellite</code>和<code>Planet</code>可能必须提供不同的行为)</li>
</ul>
<p>下面是一个示例,您首先定义自己的行为:</p>
<pre><code>#
# business as usual, define your class, methods, constants...
#
class AstronomicalObject:
# universal gravitational constant
G = 6.67300E-11
def __init__(self, mass, radius):
self.mass = mass # in kilograms
self.radius = radius # in meters
class PlanetModel(AstronomicalObject):
@property
def surface_gravity(self):
return self.G * self.mass / (self.radius * self.radius)
class SatelliteModel(AstronomicalObject):
FUEL_PRICE_PER_KG = 20000
@property
def fuel_cost(self):
return self.FUEL_PRICE_PER_KG * self.mass
def falling_rate(self, destination):
return complicated_formula(self.G, self.mass, destination)
</code></pre>
<p>然后用正确的基类/混合创建<code>Enum</code>。</p>
<pre><code>#
# then create your Enum with the correct model.
#
class Planet(PlanetModel, Enum):
MERCURY = (3.303e+23, 2.4397e6)
VENUS = (4.869e+24, 6.0518e6)
EARTH = (5.976e+24, 6.37814e6)
MARS = (6.421e+23, 3.3972e6)
JUPITER = (1.9e+27, 7.1492e7)
SATURN = (5.688e+26, 6.0268e7)
URANUS = (8.686e+25, 2.5559e7)
NEPTUNE = (1.024e+26, 2.4746e7)
class Satellite(SatelliteModel, Enum):
GPS1 = (12.0, 1.7)
GPS2 = (22.0, 1.5)
</code></pre>