python为什么枚举有这个属性

时间:2017-08-02 04:25:43

标签: python enums

这是我的代码

#coding:utf8 

from enum import Enum


class Color(Enum):
    red=1
    green=2
    black=3


Color.red.price=30.0
Color.black.price=40.0
Color.green.price=40.0

Color.green.xxx = True

为什么color.red有这个属性,比如价格或xxx或其他什么? 谢谢你的回答

3 个答案:

答案 0 :(得分:1)

Color.red有一个price属性,因为你给了它一个。 Enum成员的唯一(大部分)不可变部分是namevalue

请注意,Color.red没有xxx属性,因为您只将该属性分配给Color.green

答案 1 :(得分:0)

在此示例中,Color类对象不具有此类属性。

这里发生的是你正在创建那些属性,然后可以使用它。显然,python是动态的,东西允许这样的事情。

如果我们将对象视为值和引用的数组,那么您在此处所做的就是将另一个值(或引用)附加到当前对象。

我使用this online interpreter做了一个快速而又脏的例子:

from enum import Enum

class names(Enum):
    Paul=1
    Robert=2,
    Jean=3,
    Charles=4

names.Paul.price = 25
print(names.Paul.price)  # works, as we just added the price poperty.
print(isinstance(names.Paul, names))  # returns true, we don't lose property.
print(names.Robert.price)  # AttributeError, we didn't add it. 

答案 2 :(得分:0)

这就像任何其他对象一样。您可以向类对象添加新属性(这些属性仅属于对象)

class A:
  foo1="bar"

a=A()
a.foo2="bar2"
print(a.foo2)
print(A.foo1) 
print(A.foo2) # gives an attribute error

如果是enum

 from enum import Enum
   class A(Enum): 
..   a="enum" 
.. 

每个成员都是一个枚举对象

   dir(A.a)
=> ['__class__', '__doc__', '__module__', 'name', 'value']

   dir(Enum)
=> ['__class__', '__doc__', '__members__', '__module__']

因此,就像任何其他类对象一样,您可以向对象添加属性

A.a.foo1="bar1"