我在想,如果有在做這樣的事情什麼錯誤(從一個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