004. Python入门经典之二: 第六章演练函数和类
定义函数
#coding:utf-8
#截止目前所有接触到的函数
#pop() 删除字典中某个值
#lower() upper() 转换大小写
#keys() values() 遍历字典
#dir() 列出一个对象所有的属性和方法
''''其中dir()函数可以显示对象所包含的每个名称. 能够以字母表的顺序列出正在检查的对象中所有可用
的名称, 以下划线开头的名称被放在结果的做开始处. 严格上来说, 以下划线开头的名称是对象的私有属性
, 他们是不可见的. 即: 不能直接使用它们, 但是Python将这种权利留给了开发人员. 所以可以交互地查看
这些属性以学习它们'''
fridge={"egg":8,"mushroom":20,"pepper":3,"cheese":2,"tomato":4,"milk":13}
wanted_food="egg"
def in_fridge():
"""这是我的第一个Pythhon的函数, 同时也是在Python中第一次使用方法说明"""
try:
count = fridge[wanted_food]
except KeyError:
count=0
"""这也是我的方法说明"""
return count;
print (dir(in_fridge))
#输出结果:
'''['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']'''
print(type(wanted_food.__len__))
#输出结果: <type 'method-wrapper'> 有点看不懂了
print(wanted_food.__len__())
#输出结果: 3
#可以看到这个方法与内置函数len结果相同. 那么当一个函数内置到一个对象中时, 他叫做这个对象的方法
#所以函数len就是利用方法# __len__工作的.
定义类和创建对象demo:
#定义一个类
class FridgeDemo:
""""这是我的第一个在Python中创建的类, 就这样就定义了一个类"""
f=FridgeDemo(); #这样就创建了一个Fridge对象, 不用new
#如何编写一个类:
#1. 确定功能. 比如此处的Firdge(冰箱), 那么冰箱能够完成哪些功能: 温度/冷藏/除霜/存放食物
#2. 确定它的方法. 还是功能: 存储食物/取出食物
#3. 包含食物成分的字典
定义类并测试:
class Fridge:
"""这个类创建一个冰箱,里面的事物可以单个(批量)添加删除, 并且计数
方法:
[food_name , quantity],检查字符串food_name的值, 如果不是数字, 则给一个1为默认值
has_various(foods)检查字典中的食物,在冰箱里是否还有
add_one(food_name)-往冰箱里增加一个食物
add_many(food_dict)——往冰箱里增加多个食物, 用字典表示
get_one(food_name)——从冰箱里拿出一个食物
get_many(food_dict)拿出多个食物
get_ingredients(食物),取出多个食物
"""
def __init__(self, items={}): #str="234" ): #__init__方法就像构造函数, 第一个参数是对象自己(即实例本身变量),
#其实这里也可以看做是定义了items变量
"""Optionally pass in an initial dictionary of items"""
#print (self.str)
if type(items) != type({}):
raise TypeError("Fridge requires a dictionary but was given %s" % type(items))
self.items = items
return
def __add_multi(self, food_name, quantity):
"""这个方法带有两个参数, 参数1 是食物名称, 参数2是该食物对应的数量. 这是一个内部方法"""
if(not food_name in self.items):
self.items[food_name] = 0
self.items[food_name]=self.items[food_name]+quantity
def add_one(self,food_name):
"""这个方法将会调用__add_multi方法进行添加商品"""
if(type(food_name)) != type(""):
raise TypeError, "需要一个商品名称, 请提供一个名称%s" % type(food_name)
else:
self.__add_multi(food_name,1)
return True;
def add_many(self, food_dict={}):
"""添加多个食物, 多个食物做成字典添加"""
if(type(food_dict))!=type({}):
raise TypeError("需要一个字典列表 请传递%s" % food_dict)
for item in food_dict.keys():
self.__add_multi(item,food_dict[item]) #调用内部方法
return
"""
#开始测试
f = Fridge({"eggs":6, "milke":4, "chese":3})
print (f.items) #输出itmes变量
#输出结果{'eggs': 6, 'milke': 4, 'chese': 3}
f.add_one("grape")
print (f.items)
#输出结果{'eggs': 6, 'milke': 4, 'grape': 1, 'chese': 3}
f.add_many({"tomato":1,"orange":3,"apple":5})
print (f.items)
#输出结果{'tomato': 1, 'chese': 3, 'grape': 1, 'apple': 5, 'eggs': 6, 'milke': 4, 'orange': 3}
"""
#继续编写 , 下面的方法用于判断冰箱中是否存在某个食物, 以此来判断是否可以从冰箱中取出某种食物
def has(self,food_name, quantity=1 ):
"""判断冰箱中是否有food_name这种食物"""
return self.has_various({food_name:quantity})
def has_various(self , foods):
try:
for food in foods.keys():
if self.items[food]<foods[food]: #如果这个食物用完了就返回false
return False
return True
except KeyError: #如果self.items[food]中根本就不包含所传递的食材, 也返回false
return False
'''
#第二次测试开始
f = Fridge({"eggs": 6, "milke": 4, "chese": 3})
food="chese"
num = 5
if(f.has(food,num)):
if( f.items[food] == num): #添加一个刚好等于的判断
print ("哈哈~刚好还可以做一个%s蛋卷" % food)
print ("我们来做一个蛋卷吧")
else:
print ("蛋卷所需的材料%s不够了" % food )
#输出结果:我们来做一个蛋卷吧 通过改变不同的数字, 则输出结果不同
'''
#继续编写 从冰箱取出食物的方法
def __get_multi(self,food_name,quantity):
"""这是一个主方法, 表示从冰箱取出多少食物, 所有取出食物的方法都从此方法中调用"""
try:
if(self.items[food_name] is None):
return "None";
if(quantity>self.items[food_name]):
return False;
self.items[food_name]=self.items[food_name]-quantity; #将冰箱的食物减少
except KeyError:
return False;
return quantity
def get_one(self,food_name):
"""从冰箱取出一个食物"""
if(type(food_name)) !=type(""):
raise TypeError("请指定一个食物名称%s" % food_name)
else:
result = self.__get_multi(food_name,1) #这里写死取一个出来
return result
def get_many(self,food_dict):
"""从冰箱取出多个食物, 传递字典"""
if(self.has_various(food_dict)):
foods_removed={} #用来记录被取出的食物
for item in food_dict.keys():
foods_removed[item]=self.__get_multi(item,food_dict[item])
return foods_removed
def get_ingredients(self,food): #获取材料
try:
ingredients=self.get_many(food.__ingredients__())
except AttributeError:
return False
if ingredients !=False:
return ingredients
'''
#第三次测试开始
f = Fridge({"eggs": 6, "milke": 4, "chese": 3})
food="chese"
num = f.get_one(food)
print (num)
if(num>0):
print ("哈哈~你取出了%d个%s, 冰箱还有%d个%s" % (num, food,f.items[food],food))
else:
print ("蛋卷所需的材料%s不够了" % food )
#输出结果:哈哈~你取出了3个chese, 冰箱还有0个chese
'''
类间的调用测试:
class Omelet:
"""这个类创建一个蛋卷对象; 它可以是一个煎蛋卷, 也可以是蛋卷的材料, 有如下接口:
get_kind()返回一个字符串类型的煎蛋卷
set_kind(类型)设置蛋卷种类名
set_new_kind(name,ingredients)按照名称和成分创建蛋卷"""
def __init__(self, kind="chese"):
self.set_kind(kind)
return
def __ingredients__(self):
"""内部方法,供冰箱和其它食材调用"""
return self.needed_ingredients
def get_kind(self):
return self.kind
def set_kind(self,kind):
possible_ingredients = self.__known_kinds(kind)
if(possible_ingredients == False):
return False
else:
self.kind=kind
self.needed_ingredients = possible_ingredients
def set_new_kind(self,name,ingredients):
self.kind=name
self.needed_ingredients =ingredients
return
def __known_kinds(self,kind):
if kind=="chese":
return {"eggs": 2, "milke": 1, "chese": 1}
elif kind=="mushroom":
return {"eggs": 2, "milke": 1, "chese": 1,"mushroom":2}
elif kind=="onion":
return {"eggs": 2, "milke": 1, "chese": 1,"onion":1}
else:
return False
def get_ingredients(self,fridge):
self.from_fridge=fridge.get_ingredients(self)
def mix(self):
for ingredient in self.from_fridge.keys():
print("包含%d份%s的%s蛋卷" % (self.from_fridge[ingredient],ingredient,self.kind))
self.mixed=True
def make(self):
if (self.mixed == True):
print ("制作%s 蛋卷" % self.kind)
self.cooked = True
'''#开始测试
o = Omelet("chese")
f = Fridge({"eggs": 12, "milke": 21, "chese": 31})
o.get_ingredients(f)
o.mix()
o.make()
输出结果:
包含2份eggs的chese蛋卷
包含1份milke的chese蛋卷
包含1份chese的chese蛋卷
制作chese 蛋卷'''
f =Fridge({"eggs": 12, "milk": 21, "chese": 31})
#f =Fridge({"eggs": 12, "milk": 21, "chese": 31, "mushroom":6,"onion":5})
m = Omelet("milk")
m.get_ingredients(f)
m.mix()
m.make()
'''
c = Omelet("mushroom")
c.get_ingredients(f)
c.mix()
c.make()
'''
浙公网安备 33010602011771号