定义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()