days21

定义MySQL类

'''
1.对象有id、host、port三个属性
      
2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一
      
3.提供两种实例化方式,方式一:用户传入host和port 方式二:从配置文件中读取host和port进行实例化
      
4.为对象定制方法,save和get_obj_by_id,save能自动将对象序列化到文件中,文件路径为配置文件中DB_PATH,文件名为id号,保存之前验证对象是否已经存在,若存在则抛出异常,;get_obj_by_id方法用来从文件中反序列化出对象
'''
# file settings.py
# HOST='127.0.0.1'
# PORT=3306
# DB_PATH=r'D:\data\python\Learn\courses\day21\作业\db'
import settings

import uuid
import pickle
import os


class MySQL:
    def __init__(self, host, port):
        self.id = self.creat_id
        self.host = host
        self.port = port

    @property
    def creat_id(self):
        return str(uuid.uuid1())

    def is_exists(self):
        flag = True

        files = os.listdir(settings.DB_PATH)

        for file in files:
            file_path = os.path.join(f'{settings.DB_PATH}', f'{file}')

            with open(file_path, 'rb')as fr:
                obj = pickle.load(fr)

                if self.host == obj.host and self.port == obj.port:
                    flag = False
                    break
        return flag

    def save(self):

        # 如果路径不存在,就创建一个
        if not os.path.isdir(settings.DB_PATH):
            os.mkdir(settings.DB_PATH)

        # 拼接文件路径
        file_path = os.path.join(settings.DB_PATH, f'{self.id}.pkl')

        # 判断文件是否存在,存在就报错,不存在就保存
        if not self.is_exists():
            raise PermissionError("已存在")

        with open(file_path, 'wb') as fw:

            pickle.dump(self, fw)

    @staticmethod
    def get_obj_by_id(id):

        file_path = os.path.join(settings.DB_PATH, f'{id}.pkl')

        with open(file_path, 'rb')as fr:
            data = pickle.load(fr)
            return data

    # 对应的函数不需要实例化,不需要self参数,但第一个参数需要是表示自身类的cls参数,可以来调用类的属性,类的方法,实例化对象等
    @classmethod
    def from_conf(cls):
        return cls(settings.HOST, settings.PORT)


# 从文件中导入数据创建实例
# conn=MySQL.from_conf()
# conn.save()
#
# # 查看文件导入数据创建的示例
# data=conn.get_obj_by_id('73008cdc-ec15-11e9-b036-d46d6dd6b87e')
# print(data.__dict__)

# 传入数据创建示例
# conn1 = MySQL('127.0.0.1', 3300)
# conn1.save()

# 查看文件导入数据创建的示例
# data2=conn1.get_obj_by_id('dd8e2648-ec16-11e9-a9b4-d46d6dd6b87e')
# print(data2.__dict__)

# 传入相同数据保存时报错
# conn2 = MySQL('127.0.0.1', 3300)
# conn2.save()

定义一个类:圆形,该类有半径,周长,面积等属性,将半径隐藏起来,将周长与面积开放

import  math
class Circle:
    def  __init__(self,radius):
        self.__radius = radius

    # 计算面积
    @property
    def area(self):
        return  math.pi*self.__radius*self.__radius

    # 计算周长
    @property
    def perimeter(self):
        return 2*math.pi*self.__radius

c = Circle(10)
print(c._Circle__radius) # 10   强制访问
print(c.area) # 314.1592653589793
print(c.perimeter) # 62.83185307179586

使用abc模块定义一个phone抽象类 并编写一个具体的实现类

import abc


class Phone(metaclass=abc.ABCMeta):

    # 阅读
    @abc.abstractmethod
    def read(self):
        pass

    # 游戏
    @abc.abstractmethod
    def game(self):
        pass

    # 音乐
    @abc.abstractmethod
    def music(self):
        pass

# 华为
class Huawei(Phone):
    
    # 阅读
    def read(self):
        pass

    # 游戏
    def game(self):
        pass

    # 音乐
    def music(self):
        pass
    
    # 视频
    def video(self):
        pass

huawei = Huawei()

猜你喜欢

转载自www.cnblogs.com/jzm1201/p/11657843.html