[Python-Dev] PEP 435 -- Adding an Enum type to the Python standard library
Larry Hastings
larry at hastings.org
Fri Apr 26 19:30:40 CEST 2013
On 04/26/2013 09:27 AM, Serhiy Storchaka wrote:
> 26.04.13 18:50, Larry Hastings написав(ла):
>> The standard Java documentation on enums:
>>
>> http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
>
> This example requires more than features discussed here. It requires
> an enum constructor.
>
> class Planet(Enum):
> MERCURY = Planet(3.303e+23, 2.4397e6)
> [...]
> This can't work because the name Planet in the class definition is not
> defined.
It can't work because you inserted the word "Planet" there. If you omit
the word "Planet", this would work fine with something like the
metaclass instantiate-all-data-members behavior in flufl.enum 4.
Here is the hack, demonstrated in Python 3:
class Metaclass(type):
def __new__(cls, name, bases, namespace):
result = type.__new__(cls, name, bases, dict(namespace))
for name, value in namespace.items():
if not (callable(value) or name.startswith("__")):
value = result(name, value)
setattr(result, name, value)
return result
class Planet(metaclass=Metaclass):
MERCURY = (3.303e+23, 2.4397e6)
def __init__(self, name, value):
self.mass, self.radius = value
def surfaceGravity(self):
return 6.67300E-11 * self.mass / (self.radius ** 2)
def surfaceWeight(self, otherMass):
return otherMass * self.surfaceGravity()
print("If you weigh 175 pounds, on Mercury you'd weigh",
Planet.MERCURY.surfaceWeight(175))
//arry/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20130426/a610d639/attachment.html>
More information about the Python-Dev
mailing list