字段的默认值

时间:2017-06-07 13:58:49

标签: python object enums

我在使用python脚本中的对象访问字段时遇到问题。基本上它归结为这段代码:

from enum import Enum

class AbstractFoo:
    def __init__(self, foo='works', bar='nope'):
        self.foo = foo
        self.bar = bar

class Foo(Enum):
    test = AbstractFoo('bla', 'tada')

因此,在python控制台中,我尝试使用以下命令访问我的枚举元素:

Foo.test.foo

我希望它可以打印出来' bla'这是我传递给构造函数的值(或者至少它应该打印'工作'这将是我分配的默认值。)

我实际得到的是

AttributeError: 'Foo' object has no attribute 'foo'

你现在可以告诉我,我对python很新,尤其是python中的概念对象(我主要用Java编写代码,这可能导致我对python中对象行为的一些误解)

我想到的是,我能做到:

Foo.test.foo = 'whatever'

以这种方式为foo赋值。但是当我这样做时,我也可以为一个我甚至没有在构造函数中指定的字段赋值,例如:

Foo.test.noField = 'shouldn't even exist'

它会起到同样好的作用,我完全不了解。

我会很高兴澄清对象如何在python中工作和/或我如何在python中实现类的枚举。

编辑:如果我从Enum中删除继承,显然代码的行为方式与我想要的一样。

2 个答案:

答案 0 :(得分:3)

这可能会令人困惑,因为你确实说test是某种东西,然后就不再存在了。那是因为Enum是一种特殊的类,需要其所有成员和#34;转换"他们进入班级的实例。因此test的类型不再是AbstractFoo,而是Foo。但是,您可以使用value属性返回分配给枚举实例的原始值:

from enum import Enum

class AbstractFoo:
    def __init__(self, foo='works', bar='nope'):
        self.foo = foo
        self.bar = bar

class Foo(Enum):
    test = AbstractFoo('bla', 'tada')

print(Foo.test.value.foo)

>>> bla

答案 1 :(得分:1)

正如@jdehesa所说,Enum成员是他们的父Enum类的实例。如果你需要它们也是其他类的实例,只需继承它:

class Foo(AbstractFoo, Enum):
    test = 'bla', 'tada'

请注意,您不再需要直接致电AbstractFoo