day21 作业

1、定义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方法用来从文件中反序列化出对象


'''
setting.py 文件内容如下:
# [MySQL]
HOST = "192.168.32.128"
PORT = "3306"
DB_PATH = r"C:\Users\Administrator\Desktop\老男孩python文档\老男孩Python程序编写\正式班\day 21\课堂练习\db"

'''

import uuid
import pickle
import setting
import os
# print(uuid.uuid1())

# 1、定义MySQL类
class MySQL():
    def __init__(self,host,port):
        self.host = host
        self.port = port
        self.id = self.create_id

    # 定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一
    @property
    def create_id(self):
        return str(uuid.uuid1())

    '''
    4.为对象定制方法,save和get_obj_by_id,save能自动将对象序列化到文件中,
    文件路径为配置文件中DB_PATH,文件名为id号,
    保存之前验证对象是否已经存在,若
    存在则抛出异常,;get_obj_by_id方法用来从文件中反序列化出对象
    '''

    # 使用property装饰器变成一个属性  让其它方法引用
    @property
    def is_exists(self):
        tag = True
        files = os.listdir(setting.DB_PATH)
        for f in files:
            file_path = os.path.join(f"{setting.DB_PATH}", f"{f}")
            with open(file_path,"rb") as f:

                # 将对象从文件里读出来,与传入的对象比较,如果存在那么就报错,对象已存在
                obj = pickle.load(f)
                if self.host == obj.host and self.port == obj.port:
                    tag = False
                    break
        return tag

    # 保存对象
    def save(self):
        file_path = os.path.join(f"{setting.DB_PATH}",f"{self.id}.txt")
        # file_path = f"{setting.DB_PATH} + {os.sep} + {self.id}.txt"
        if not self.is_exists:
            raise PermissionError("对象已存在")
        with open(file_path,"wb") as f:
            pickle.dump(self,f)

    # get_obj_by_id 方法用来从文件中反序列化出对象
    # 被 @staticmethod 装饰器装饰的方法就是非绑定方法,就是一个普通的函数,可以直接使用类名.方法调用
    @staticmethod
    def get_obj_by_id(id):
        file_path = os.path.join(f"{setting.DB_PATH}",f"{id}.txt")
        with open(file_path,"rb") as f:
            data = pickle.load(f)
            return data

    @property
    def from_conf(self):
        return setting.HOST,setting.PORT




# 实例化:传入ip、port
mysql1 = MySQL("192.168.32.128","3306")
id = mysql1.create_id
print(id)
mysql1.save()
print(MySQL.get_obj_by_id("faac1062-ebfd-11e9-8c9a-5c969d851d2a").host)

# 可从类中方法获取 ip、port
print(mysql1.from_conf)

终端打印结果

e6726927-ebff-11e9-8bbc-5c969d851d2a    # 打印id

Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/老男孩python文档/老男孩Python程序编写/正式班/day 21/课堂练习/day21作业.py", line 93, in <module>
    mysql1.save()
  File "C:/Users/Administrator/Desktop/老男孩python文档/老男孩Python程序编写/正式班/day 21/课堂练习/day21作业.py", line 69, in save
    raise PermissionError("对象已存在")
PermissionError: 对象已存在  # 对象已经保存至文件 主动抛错
    
192.168.32.128      # get_obj_by_id 方法反序列化得到对象的host
('192.168.32.128', '3306')  

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


'''
2、定义一个类:圆形,该类有半径,周长,面积等属性,将半径隐藏起来,将周长与面积开放
'''
import math
class Circle:
    def __init__(self):     # 传入○的半径
        self.__banjing = 1    # 隐藏半径属性

    # 使用property装饰器当做属性引用
    @property
    def area(self):                 # 计算面积
        return math.pi * self.__banjing**2

    @property
    def zhouchang(self):
        return 2*math.pi*self.__banjing

c = Circle()
print(c.area)       # 求该圆的面积

print(c.zhouchang)  # 求该圆的周长

终端打印结果

3.141592653589793
6.283185307179586

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


'''
使用abc模块定义一个phone抽象类 并编写一个具体的实现类
'''
import abc
class iPhone(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def play(self):
        pass
    @abc.abstractmethod
    def take_phone(self):
        pass
class hongmi(iPhone):
    # 子类继承父类的属性,必须遵循父类的规范
    def play(self):
        pass
    def take_phone(self):
        pass

猜你喜欢

转载自www.cnblogs.com/qinyujie/p/11655430.html
今日推荐