gpt4 book ai didi

python - 字段的默认值

转载 作者:太空宇宙 更新时间:2023-11-03 14:53:35 24 4
gpt4 key购买 nike

我在访问 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”,这是我传递给构造函数的值(或者至少它应该打印“works”,这是我分配的默认值)。

我实际得到的是

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 中删除继承,代码将按我希望的方式运行。

最佳答案

这可能会让人非常困惑,因为您实际上是在说 test 是某种东西,然后它就不再是了。那是因为 Enum是一种特殊的类,它接受它的所有成员并将它们“转换”为该类的实例。所以 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

关于python - 字段的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44414783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com