<p>您正在寻找具有类的面向对象设计(OOP-面向对象编程)。dictionary或namedtuple方法可能是最简单、最适合您的项目。你知道吗</p>
<p>OOP非常强大,很好理解。我将向你展示一些更先进的东西,你可以做的类。您可以使类与python运算符+、-、/、*等一起工作。<a href="http://rafekettler.com/magicmethods.html" rel="nofollow">http://rafekettler.com/magicmethods.html</a></p>
<p>示例:</p>
<pre><code> import collections
class Ingredients(collections.OrderedDict):
"""List of ingredients with their amounts.
You could customize this more to force each key to have a unit.
You could also create your own Ingredient class that has a unit and
force every value in this dictionary to be an Ingredient with the
__setitem__ magic method.
"""
def __init__(self, items):
super().__init__(sorted(items)) # sort the items
# Remove name
if "name" in self:
self.pop("name")
# Force servings as the first item
if "servings" not in self:
self["servings"] = 1
self.move_to_end("servings", last=False)
# end Constructor
def __str__(self):
"""Return the string representation."""
return ", ".join((key+": "+str(self[key]) for key in self))
# end class Ingredients
class Cake(object):
"""Create a cake."""
def __init__(self, number=1):
super().__init__()
self.name = "Cake"
self.servings = 1
self.init_ingredients()
if number > 1:
self *= number
def init_ingredients(self):
"""Initialize ingredients."""
self.flour = 240
self.sugar = 300
# end init_ingredients
def ingredients(self):
"""Return a copy of the ingredients."""
# self.__dict__ contains all of the users variables
return Ingredients(self.__dict__.items())
# end ingredients
def update_ingredients(self, other):
"""Update the ingredients values from a dictionary."""
self.__dict__.update(other)
# end update_ingredients
def show_ingredients(self):
ingred = str(self).replace(", ", "\n")
print(ingred)
# end show_ingredients
def __str__(self):
return self.name +", "+ str(self.ingredients())
# end __str__
def __add__(self, other):
"""Add the total number of ingredients. Uses + operator (mycake + 2)."""
if not isinstance(other, Cake):
raise TypeError
# Add ingredients
ingredients = self.ingredients()
otheri = other.ingredients()
for key in otheri:
try:
ingredients[key] = ingredients[key] + otheri[key]
except KeyError:
ingredients[key] = otheri[key]
# Edit the name?
ingredients["name"] = self.name
if other.name not in self.name:
ingredients["name"] = self.name + " & " + other.name
new_cake = self.__class__()
new_cake.update_ingredients(ingredients)
return new_cake
# end __add__
def __iadd__(self, other):
"""Add and store."""
ingredients = self + other
self.update_ingredients(ingredients)
return self
# end __iadd__
def __imul__(self, other):
"""multiply and store. Uses * operator (mycake *= 2)."""
ingredients = self.ingredients()
for key in ingredients:
ingredients[key] *= other
self.update_ingredients(ingredients)
return self
# end __imul__
def __mul__(self, other):
"""Copy and return the multiplied value. Uses * operator (mycake * 2)."""
new_cake = self.__class__()
new_cake.update_ingredients(self.ingredients())
new_cake *= other
return new_cake
# end __mul__
def __rmul__(self, other):
"""Copy and return the multiplied value. Uses * operator (2 * mycake)."""
return self.__mul__(other)
# end __rmul__
# end class Cake
class ChocolateCupcake(Cake):
"""Create chocolate cupcakes."""
def init_ingredients(self):
"""Initialize ingredients."""
super().init_ingredients() # Cake.init_ingredients(self)
self.name = "Chocolate Cupcakes"
self.servings = 12
self.flour = 12
self.sugar = 14
self.chocolate_chips = 8
# end init_ingredients
# end class ChocolateCupcake
mycake = Cake()
print(mycake*2)
print(mycake)
mycake *= 3
print()
mycake.show_ingredients()
choco = ChocolateCupcake(2)
print()
choco.show_ingredients()
print()
print("Total Ingredients", mycake+choco)
print()
both = mycake + choco
both.show_ingredients()
</code></pre>