将类的所有实例存储在类字段中是不是很糟糕?

mol*_*lok 2 python oop field class

我想知道在做这样的事情时是否有任何错误(从OOP的角度来看):

class Foobar:
    foobars = {}
    def __init__(self, name, something):
        self.name = name
        self.something = something

        Foobar.foobars[name] = self

Foobar('first', 42)
Foobar('second', 77)

for name in Foobar.foobars:
    print name, Foobar.foobars[name]
Run Code Online (Sandbox Code Playgroud)

编辑:这是我正在使用的实际代码片段

from threading import Event
class Task:
    ADDED, WAITING_FOR_DEPS, READY, IN_EXECUTION, DONE = range(5)
    tasks = {}
    def __init__(self, name, dep_names, job, ins, outs, uptodate, where):
        self.name = name
        self.dep_names = [dep_names] if isinstance(dep_names, str) else dep_names
        self.job = job
        self.where = where
        self.done = Event()
        self.status = Task.ADDED
        self.jobs = []
        # other stuff...
        Task.tasks[name] = self
    def set_done(self):
        self.done.set()
        self.status = Task.DONE
    def wait_for_deps(self):
        self.status = Task.WAITING_FOR_DEPS
        for dep_name in self.dep_names:
            Task.tasks[dep_name].done.wait()
        self.status = Task.READY
    def add_jobs_to_queues(self):
        jobs = self.jobs
        # a lot of stuff I trimmed here
        for w in self.where: Queue.queues[w].put(jobs)
        self.status = Task.IN_EXECUTION
    def wait_for_jobs(self):
        for j in self.jobs: j.wait()
    #[...]
Run Code Online (Sandbox Code Playgroud)

如您所见,我需要使用wait_for_deps方法中的所有实例访问字典.拥有全局变量而不是类字段会更有意义吗?我可能在这里使用了错误的方法,也许那些东西甚至不应该在一个方法中,但它对我来说是有道理的(我是OOP的新手)

S.L*_*ott 9

是.这不好.它将实例与实例集合混淆.

收藏是一回事.

收集的实例是无关的.

此外,更新的类级变量会使我们中的一些人感到困惑.是的,我们最终可以推断出正在发生的事情,但标准期望™是状态变化适用于对象,而不是类.


 class Foobar_Collection( dict ):
     def __init__( self, *arg, **kw ):
         super( Foobar_Collection, self ).__init__( *arg, **kw ):
     def foobar( self, *arg, **kw ):
         fb= Foobar( *arg, **kw )
         self[fb.name]= fb
         return fb

 class Foobar( object ):
     def __init__( self, name, something )
         self.name= name
         self.something= something

fc= Foobar_Collection()
fc.foobar( 'first', 42 )
fc.foobar( 'second', 77 ) 

for name in fc:
    print name, fc[name]
Run Code Online (Sandbox Code Playgroud)

这更典型.


在您的示例中,wait_for_deps它只是一个任务集合的方法,而不是单个任务.你不需要全局变量.

你需要重构.