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()
'''

 

posted on 2017-03-02 10:03  印子  阅读(206)  评论(0)    收藏  举报

导航