我在想,如果有在做这样的事情什么错误(从一个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的新手)
如果你决定继续这样做,我建议你使用`self.foobars `或`type(self).foobars`,这样这个类就不会被硬编码。后者需要新式类(即从对象继承的类)。 “ – 2011-01-28 18:09:12