gpt4 book ai didi

python - 将类的所有实例存储在类字段中是否不好?

转载 作者:行者123 更新时间:2023-11-28 19:36:09 24 4
gpt4 key购买 nike

我想知道做这样的事情是否有什么问题(从 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]

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

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()
#[...]

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

最佳答案

是的。这不好。它将实例与实例集合混为一谈。

集合是一回事。

收集到的实例是不相关的。

此外,更新的类级变量让我们中的一些人感到困惑。是的,我们最终可以推断出发生了什么,但标准预期™ 是状态更改适用于对象,而不是类。


 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]

那更典型。


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

你需要重构。

关于python - 将类的所有实例存储在类字段中是否不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4831307/

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