设计模式之单例

内容概要

  • 面向对象练习
  • 设计模式简介
  • 设计模式之单例模式
  • pickle模块

面向对象练习

'''编写元类规定对象的所有数据转为大写'''
eg:
obj.name = 'Tom'
print(obj.name) # TOM

1. 重新元类Type的双下方法 以双下call为例
class MyTypeClass(type):
def __call__(self, *args, **kwargs):
args = [i.upper() for i in args]
return super().__call__(*args, **kwargs)

class MyClass(metaclass=MyTypeClass):
def __init__(self, name,gender):
self.name = name
self.gender = gender
obj = MyClass('Tom','male')
print(obj.name,obj.gender)

2. 直接将对象的值改为大写
class MyClass(object):
def __init__(self, name,gender):
self.name = name
self.gender = gender

def __setattr__(self, key, value):
# 直接将对象的值改为大写
self.__dict__[key] = value.upper()

obj = MyClass('Tom','male')
print(obj.name,obj.gender)

设计模式简介

在IT行业中设计模式总共有23种 可以分为三大类
1.创建型
2.结构型
3.行为型

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。
这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
"""
设计模式是前辈们发明的经过反复验证用于解决固定问题的固定套路
"""
# 我们目前不需要详细掌握(知识点还不够) 了解即可

设计模式之单例

# 设计模式之单例模式(23种之一)
单例模式的意思是一个类只能产生一个对象 用于节省资源
应用场景:
有一个类中有很多非常牛逼的绑定给对象的方法
我们需要在很多地方使用它 那么不同的程序员来用不知道有没有产生对象
所以自己会创建一个新对象 如此往复则会造成资源的浪费
如何实现:
我们需要在类实例化对象的时候进行干涉 >>>: 元类
单例模式:(可以有很多种编写方式)
class Single(type):
new_obj = None
def __call__(self, *args, **kwargs):
# 判断对象是否以存在
if not self.new_obj:
# 如不存在则新建对象
obj = super().__call__(*args, **kwargs)
self.new_obj = obj
return self.new_obj
# 如已存在直接返回不会新建对象
return self.new_obj


class MyClass(metaclass=Single):
def __init__(self, name):
self.name = name


obj1 = MyClass('jason')
obj2 = MyClass('tony')
print(id(obj1), id(obj2))
print(obj1.__dict__, obj2.__dict__)

'''单例的实现方式不固定 有很多种'''
其他单例的实现参考:https://www.cnblogs.com/Dominic-Ji/p/10525994.html

pickle模块

"""
将该模块的目的仅仅是为了在选课系统中使用 后期会学习ORM就不会用pickle了
并且该模块只支持python 兼容性很差!!!
"""
需求:将对象保存到文件 并且取出来之后还可以使用对象的功能
import pickle

class MyClass(object):
school = 'school'
def __init__(self, name):
self.name = name
def choose_course(self):
print('%s正在选课'%self.name)
obj = MyClass('jason')
print(obj.school)
obj.choose_course()

# pickle可以
# with open(r'%s'%obj.name,'wb') as f:
# pickle.dump(obj, f)

with open(r'jason','rb') as f:
data = pickle.load(f)
print(data)
print(data.name)
print(data.school)


posted @ 2022-04-12 17:56  Mr_胡萝卜须  阅读(21)  评论(0编辑  收藏  举报