我在使用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中删除继承,显然代码的行为方式与我想要的一样。
答案 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
。