第二十一天作业

今日作业

# 0、课堂代码理解,并敲两遍以上 (技术的牛逼是靠量的积累)
'''
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方法用来从文件中反序列化出对象
'''
import uuid
import os
import settings
import pickle


# 1、定义MySQL类
# 对象有id、host、port三个属性
class MySql:
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.id = self.creat_id()

    # 随机生成id,保证id唯一
    @staticmethod
    def creat_id():
        return str(uuid.uuid1())

    # 从配置文件中读取host和port进行实例化
    @classmethod
    def from_conf(cls):
        print(cls)
        return cls(settings.HOST, settings.PORT)

    @property
    def is_excited(self):
        tag = True
        files = os.listdir(settings.DB_PATH)
        print(files)
        for file in files:
            if not file.endswith('.pkl'):
                continue
            file_abspath = r'%s%s%s' % (settings.DB_PATH, os.sep, file)
            print(settings.DB_PATH)
            print(file_abspath)
            obj = pickle.load(open(file_abspath, 'rb'))

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

    def save(self):
        if not self.is_excited:
            raise PermissionError('对象已存在')
        file_path = r'%s%s%s.pkl' % (settings.DB_PATH, os.sep, self.id)
        pickle.dump(self, open(file_path, 'wb'))

    @staticmethod
    def get_obj_by_id(id):
        file_abspath = r'%s%s%s.pkl' % (settings.DB_PATH, os.sep, id)
        return pickle.load(open(file_abspath, 'rb'))


conn1 = MySql('127.0.0.1', 3306)
# conn1.save()
print(conn1.get_obj_by_id('4bf9b422-ec36-11e9-a936-fc3fdb5efe9f').__dict__)



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

class Round:
    def __init__(self,bj):
        self.__bj = bj
    # 计算周长
    @property
    def zc(self):
        return 2*3.16*self.__bj
    # 计算面积
    @property
    def mj(self):
        return 3.14*(self.__bj**2)


r = Round(3)

print(r.zc)
print(r.mj)

print(r._Round__bj)
        
    
# 3、使用abc模块定义一个phone抽象类 并编写一个具体的实现类
import abc


class Phone(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def call(self):
        print('打电话')

    @abc.abstractmethod
    def send_email(self):
        print('发信息')

    @abc.abstractmethod
    def photo(self):
        print('拍照片')


class MiPhone(Phone):
    def call(self):
        print('我也能打电话')

    def send_email(self):
        print('我也能发短息')

    def photo(self):
        print('我也能拍照片')



猜你喜欢

转载自www.cnblogs.com/lyyblog0715/p/11657564.html