面向对象实现电话簿

"""
使用面型对象思想实现电话簿
采用封装,继承等手段实现。
题目分析:
电话簿中一般实现都是{人名:电话},但是人名出现重复怎们做
删除电话:根据人名删除还是电话删除
修改电话:修改人名还是修改电话
查询:人名查电话还是电话查人名,是准确查找还是模糊查找呢
================================================
针对上述问题实现一个电话簿

"""

class base_check(object):
    """
    实现一个检测输入的类:因为电话簿中存在大量的输入操作,因此对于输入的人名或者是电话都需要一个检测
    """
    def check_name_phone(self, name=None, phone=None):
        # 检测人名的合法性
        if name is not None:
            # 判断名字是不是字符串
            if isinstance(name, str):
                # 名字长度大于0小于等于30,并且由字符组成
                if 0 < len(name) <= 30 and name.isalpha():
                    return True
                else:
                    return False
            else:
                return False

        if phone is not None:
            # 电话是字符串
            if isinstance(phone, str):
                # 电话大于等于3并且小于等于11,并且电话是由数字组成的
                if 3 <= len(phone) <= 11 and phone.isdigit():
                    return True
                else:
                    return False
            else:
                return False

    # 获取人名
    def get_name(self):
        name = input("【输入联系人】: ").strip() # 去点多余的前后空格
        while True:
            if self.check_name_phone(name=name):
                return name
            else:
                name = input("【姓名格式有误,请重新输入联系人】: ").strip() # 去点多余的前后空格

    # 获取电话
    def get_phone(self):
        phone = input("【输入电话号】: ").strip() # 去点多余的前后空格
        while True:
            if self.check_name_phone(phone=phone):
                return phone
            else:
                phone = input("【电话格式有误,请重新输入电话号】: ").strip() # 去点多余的前后空格


class phonedir(base_check):
    """
    这个类用于实现电话簿的增删改操作
    """
    def __init__(self):
        self.__dir = {} # 私有的字典存储{电话:姓名}

    # 添加
    def add(self):
        name = self.get_name()
        phone = self.get_phone()
        self.__dir[phone] = name
        print("添加成功!\n",
              {name : phone})

    # 删除
    def rem(self):
        while True:
            tmp = input("【选择删除方式:1-根据人名删除 2-根据电话删除 3-退出本次删除操作】:")
            if tmp == "1":
                name = self.get_name()
                if name in self.__dir.values():
                    for i in self.__dir.items(): # items方法返回键值对
                        if i[1] == name:
                            self.__dir.pop(i[0])
                        break
                    print("删除成功!")
                else:
                    print("待删除姓名不存在!")
                    break
            elif tmp == "2":
                phone = self.get_phone()
                if phone in self.__dir.keys():
                    self.__dir.pop(phone)
                    print("删除成功!")
                else:
                    print("待删除的电话不存在!")
                    break
            elif tmp == "3":
                break
            else:
                print("标签有误重新输入!")


    # 修改姓名或者电话
    def edit(self):
        while True:
            tmp = input("【选择删除方式:1-修改人名 2-修改电话 3-结束本次修改操作】:")
            if tmp == "1":
                name = self.get_name()
                if name in self.__dir.values():
                    for i in self.__dir.items():
                        if i[1] == name:
                            print("下面输入新姓名!")
                            new_name = self.get_name()
                            self.__dir[i[0]] = new_name
                            print("修改成功!")
                            break
                else:
                    print("带修改得人名不存在!")
                    break
            elif tmp == "2":
                phone = self.get_phone()
                if phone in self.__dir.keys():
                    name = self.__dir[phone] # 保存姓名,因为电话是key,姓名是value
                    self.__dir.pop(phone)
                    print("下面输入新电话!")
                    new_phone = self.get_phone()
                    self.__dir[new_phone] = name
                    print("修改成功!")
            elif tmp == "3":
                break
            else:
                print("标签有误重新输入!")

    # 明确查询
    def find_nameorphone(self):
        while True:
            tmp = input("【选择查询方式:1-通过姓名查询 2-通过电话查询 3-结束本次查询】:")
            if tmp == "1":
                name = self.get_name()
                if name in self.__dir.values():
                    for i in self.__dir.items():
                        if i[1] == name:
                            print({name:i[0]})
                            print("查询成功!")
                            break
                else:
                    print("查询的姓名不存在!")
            elif tmp == "2":
                phone = self.get_phone()
                if phone in self.__dir.keys():
                    print({self.__dir[phone]:phone})
                else:
                    print("查询的电话不存在!")
            elif tmp == "3":
                break
            else:
                print("标签有误重新输入!")

    # 模糊查询,根据姓名或者电话的前缀查询
    def find_nameorphone_pos(self):
        while True:
            tmp = input("【选择查询方式:1-通过姓名前缀查询 2-通过电话前缀查询(最少三位数字) 3-结束本次查询】:")
            if tmp == "1":
                name_pos = self.get_name()
                for i in self.__dir.items():
                    if str(i[1]).find(name_pos,0) != -1:
                        print({str(i[1]):str(i[0])})
                else:
                    print("未找到相关联系人!")
            elif tmp == "2":
                phone_pos = self.get_phone()
                for i in self.__dir.keys():
                    if str(i).find(phone_pos,0):
                        print({self.__dir[i]:i})
                else:
                    print("未找到相关联系人!")
            elif tmp == "3":
                break
            else:
                print("标签有误重新输入!")

    def showall(self):
        print("------电话簿------人数%d"%(len(self.__dir)))
        for i in self.__dir.items():
            print({str(i[1]):str(i[0])})
        print("-----------------------")


class Main():
    """
    这个类是最后的封装类,给用户使用的类
    """
    def __init__(self):
        self.__phonedir = phonedir()

    # 打印一个提示目录
    def __Print(self):
        while True:
            opt = input("==============================\n"
                        "= ******欢迎使用我的电话簿******=\n"
                        "=    1-------添加联系人        =\n"
                        "=    2-------删除联系人        =\n"
                        "=    3-------修改联系人        =\n"
                        "=    4-------精准查询联系人     =\n"
                        "=    5-------模糊查询联系人     =\n"
                        "=    6-------显示所有联系人     =\n"
                        "=    7-------退出电话簿        =\n"
                        "===============================\n"
                        "请输入:")
            if opt.isdigit() and int(opt) > 0 and int(opt) < 8:
                return opt
            else:
                print("输入标签有误重新输入!")

    def main(self):
        while True:
            opt = self.__Print()
            if opt == "1":
               self.__phonedir.add()
            elif opt == "2":
                self.__phonedir.rem()
            elif opt == "3":
                self.__phonedir.edit()
            elif opt == "4":
                self.__phonedir.find_nameorphone()
            elif opt == "5":
                self.__phonedir.find_nameorphone_pos()
            elif opt == "6":
                self.__phonedir.showall()
            else:
                print("欢迎下次使用!")
                break

main = Main()
main.main()

一个正在努力学习python的小白!