Python 声明静态值时,类作为自己的控制器时发生NameError

Python 声明静态值时,类作为自己的控制器时发生NameError,python,class,object,object-oriented-analysis,Python,Class,Object,Object Oriented Analysis,我希望一个类成为它自己的控制器,并启动一些默认值,如下所示: class Foo: FOOS = [Foo(5), Foo(3), Foo(4)] def __init__(self, bar): self.bar = bar 但是我得到一个namererror异常: `Traceback (most recent call last): File "/home/user/test.py", line 1, in <module> cl

我希望一个类成为它自己的控制器,并启动一些默认值,如下所示:

class Foo:
    FOOS = [Foo(5), Foo(3), Foo(4)]

    def __init__(self, bar):
        self.bar = bar
但是我得到一个
namererror
异常:

`Traceback (most recent call last):
  File "/home/user/test.py", line 1, in <module>
    class Foo:
  File "/home/user/test.py", line 2, in Foo
    FOOS = [Foo(5), Foo(3), Foo(4)]
NameError: name 'Foo' is not defined
`回溯(最近一次呼叫最后一次):
文件“/home/user/test.py”,第1行,在
Foo类:
文件“/home/user/test.py”,第2行,在Foo中
FOOS=[Foo(5)、Foo(3)、Foo(4)]
NameError:未定义名称“Foo”
问题:让类成为自己的控制器的正确Python方式是什么?

旁注:我不敢相信我是第一个有这个问题的人。如果是复制品,我还没找到


编辑:查看评论以了解为什么我认为这不是链接问题的重复,我不想用解释来污染我的问题。

你可以这样做:

class Foo:
    pass

Foo.FOOS = [ Foo(), Foo() ]

在类上有一个静态方法,该方法初始化在实例化该类的任何实例之前必须调用的值。如果尝试,可通过引发错误来强制执行此操作:

class Foo:
    FOOS = []
    init = False

    def __init__(self, bar):
        if not Foo.init:
            pass # raise some error
        self.bar = bar

    @staticmethod    
    def initialise():
        if not Foo.init:
            Foo.init = True
            Foo.FOOS = [Foo(5), Foo(3), Foo(4)]

Foo.initialise()
thing = Foo(2)

究竟什么时候应该申报FOO?在创建此类的新实例时?什么时候启动程序?Elsewhen?@DWuest启动该程序时,我认为可能与之相关,但我的问题并不完全是重复的,也不是给网站带来什么。首先,我的示例中只有一个类,而链接线程中只有3个。如果问题是相同的(我觉得情况并非如此),我的解决方案对于遇到同样困难的人来说应该更加清晰。此外,我还要求提供一种使类成为自己的控制器的特定方法,这使我的问题更倾向于Python中的POO实践,而不仅仅是解决异常。如果你让我说的话,我可以详细说明我所说的“Pythonic”是什么意思。这个答案很有效,我不太喜欢这样构造我的代码,但是如果它是用Python实现的,那么我想它是可以的。我会等一等,看看是否有人发布了另一个我更喜欢的解决方案,如果没有,我会验证你的解决方案。谢谢您想要的是类似的但不完全是单例设计的模式,因为您有一个类跟踪它自己的实例化。也许在python中搜索这样的实现可能会给您一些其他选择的灵感,但是我非常喜欢我所建议的透明性。