<p>如果您更改一些代码,您可以将所有创建的<code>Unit</code>作为类变量存储在<code>Unit</code>中。工厂方法应该是classmethods,并将自动向其中添加/创建实例。你知道吗</p>
<pre><code>class Unit():
UNITS = {} # shared btw. instances
def __init__(self, name, value):
self.name = name
self.value = value
# nicer output
def __repr__(self): return "{} - {}".format(self.name, self.value)
def __str__(self): return repr(self)
# this should be a classmethod instead, depending on your usage you might want to
# raise Errors instead of returning existing instances
def create_new_unit(name, value):
# create if needed, else return the one already in
# does not alter Unit.value if present
u = Unit.UNITS.setdefault(name, Unit(name,value))
if u.value != value:
raise ValueError("Unit '{}' exists with different value".format(name))
else:
return u
# this should be a classmethod instead, depending on your usage you might want to
# raise Errors instead of returning existing instances def add_new_unit(name, value):
# create new unit or alter an existing Unit's value
# you should rename the method accordingly
u = Unit.UNITS.setdefault(name, Unit(name,value))
u.value = value # change it if called again
return Unit.UNITS
unit1 = create_new_unit('reactor1', 1)
unit2 = create_new_unit('reactor2', 2)
all_units = add_new_unit('reactor3', 3)
for u in Unit.UNITS:
print(id(Unit.UNITS[u]),Unit.UNITS[u])
all_units = add_new_unit('reactor3', 4)
for u in Unit.UNITS:
print(id(Unit.UNITS[u]),Unit.UNITS[u])
</code></pre>
<p>输出:</p>
<pre><code>140125186245968 reactor1 - 1
140125186246024 reactor2 - 2
140125186246080 reactor3 - 3
140125186245968 reactor1 - 1
140125186246024 reactor2 - 2
140125186246080 reactor3 - 4 # changed by add_new_unit
# if create_new_unit(..) same named unit again with different value:
# ValueError: Unit 'reactor2' exists with different value
</code></pre>
<hr/>
<p>就我个人而言,我建议不要创建多个实例化新方法的方法。我可能会把“工厂方法”作为@classmethods,而不是放在普通程序中。这样<code>Unit</code>的所有<em>内务处理</em>都由
<code>Unit</code>类本身,您可以将逻辑集中在它所属的位置,而不必在主程序中添加创建的单元。你知道吗</p>
<p>建议阅读<code>@classmethod</code>:<a href="https://stackoverflow.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner">Meaning of @classmethod and @staticmethod for beginner?</a></p>