【发布时间】:2011-06-17 09:47:54
【问题描述】:
我想知道做这样的事情是否有什么问题(从 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这样类就不会被硬编码。后者需要新型类(即从对象继承的类)。