2017-08-02 54 views
-2

这是我的代码蟒蛇为什么枚举有这个属性

#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或什么? 谢谢你回答

+0

我希望这会导致错误。它不应该有这些属性。 – Carcigenicate

+0

@Carcigenicate有趣的是,我尝试了这一点,它的工作原理。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ我试过了,但我手机上的QPython没有运行足够新的版本来安装该模块。我查看了文档,找不到价格字段。 python是否允许通过特殊的调整来实时添加属性,JS风格? – Carcigenicate

回答

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. 
+0

Omg,它已经越来越晚了,我意识到我描述的行为没有解释太多。 稍后可能会编辑。 –

1

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

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

+0

谢谢,很高兴知道 – kunpengku

0

这就像任何其他物体一样。可以添加新的属性的类对象(这些属性只属于对象)

class A: 
    foo1="bar" 

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

在枚举的情况下

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"