Ist es möglich, eine Klasse zu definieren Konstante innerhalb einer Enum?

Python 3.4 bringt ein neues Modul enum, die fügt eine der Aufzählungstyp um die Sprache. Die Dokumentation für enum.Enum bietet ein Beispiel zu zeigen, wie es kann erweitert werden:

>>> class Planet(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)
...     def __init__(self, mass, radius):
...         self.mass = mass       # in kilograms
...         self.radius = radius   # in meters
...     @property
...     def surface_gravity(self):
...         # universal gravitational constant  (m3 kg-1 s-2)
...         G = 6.67300E-11
...         return G * self.mass / (self.radius * self.radius)
...
>>> Planet.EARTH.value
(5.976e+24, 6378140.0)
>>> Planet.EARTH.surface_gravity
9.802652743337129

Diesem Beispiel wird außerdem veranschaulicht ein problem mit Enum: in der surface_gravity() Eigenschaft Methode, eine Konstante G definiert, die normalerweise definiert werden, die auf Klassen-Ebene - aber Versuch zu tun, so innerhalb von ein Enum würde einfach hinzufügen, dass es als eines der Mitglieder der enum, so dass anstelle es definiert wurden, die innerhalb der Methode.

Wenn die Klasse wollte diese Konstante verwenden, die in anderen Methoden, es müsste definiert werden, die es als gut, was natürlich nicht ideal ist.

Gibt es eine Möglichkeit, eine Klasse zu definieren Konstanten, die innerhalb einer Enum oder einige Abhilfe, um den gleichen Effekt erzielen?

  • Was ist das problem mit einem Modul-Ebene konstant?
  • manchmal eine Konstante ist spezifisch für eine Klasse.
  • Ich weiß, das Beispiel ist aus dem offiziellen Google docs, aber ist es wirklich eine gute Idee? Dies könnte ein has-a Beziehung statt is-a.
InformationsquelleAutor Zero Piraeus | 2013-07-28
Schreibe einen Kommentar