day30
需求:编写元类规定对象的所有数据值转大写
eg:
obj.name = 'joanna'
print(obj.name) # JOANNA
class MyTypeClass(type): # 定义一个类接收type父类 def __call__(self, *args, **kwargs): # 重新定义双下call功能 双下call方法:对象被加括号调用的时候自动触发 args = [i.upper() for i in args] # for循环写入大写的用户名 return super().__call__(*args, **kwargs) # 返回之前的双下call功能 class MyClass(metaclass=MyTypeClass): def __init__(self, name, gender): # 对象实例化自动触发双下init self.name = name self.gender = gender def __setattr__(self, key, value): # 双下setattr方法:对象在执行添加属性操作的时候自动触发 self.__dict__[key] = value.upper() # 定义一个字典 v值调用用户名 obj = MyClass('joanna', 'male') print(obj.name) # JOANNA print(obj.gender) # MALE obj.hobby = 'jdb' print(obj.hobby) # JDB
在IT行业中设计模式总共有23种 可以分为三大类
1.创建型
2.结构型
3.行为型
设计模式是前辈们发明的经过反复验证用于解决固定问题的固定套路
单例模式的意思是一个类只能产生一个对象 用于节省资源
应用场景:
有一个类中有很多非常牛逼的绑定给对象的方法
我们需要在很多地方使用它 那么不同的程序员来用不知道有没有产生对象
所以自己会创建一个新对象 如此往复则会造成资源的浪费
如何实现:
我们需要在类实例化对象的时候进行干涉 >>>: 元类
单例模式:(可以有很多种编写方式)
class Single(type): # 定义一个类 继承type父类 new_obj = None # 定义新的对象=空 def __call__(self, *args, **kwargs): # 重新定义双下call 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)) # 140447177405384 140447177405384 内存地址相同 print(obj1.__dict__, obj2.__dict__) # {'name': 'jason'} {'name': 'jason'} 对象也相同
单例的实现方式不固定 有很多种 可以进博客中了解
https://www.cnblogs.com/Dominic-Ji/p/10525994.html
该模块仅仅是为了在选课系统中使用 后期会学习ORM就不会用pickle了
并且该模块只支持python 兼容性很差!!!
语法
with open(r'%s'%obj.name,'wb') as f: pickle.dump(obj, f)
目的:为了练写面向对象编程
项目分析: 选课系统 角色:学校、学员、课程、讲师 要求: 1. 创建北京、上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 3. 课程包含,周期,价格,通过学校创建课程 4. 通过学校创建班级, 班级关联课程、讲师 5. 创建学员时,选择学校,关联班级 5. 创建讲师角色时要关联学校, 6. 提供三个角色接口 6.1 学员视图, 可以登录,注册, 选择学校,选择课程,查看成绩 6.2 讲师视图, 讲师登录,选择学校,选择课程, 查看课程下学员列表 , 修改所管理的学员的成绩 6.3 管理视图,登录,注册,创建讲师, 创建班级,创建课程,创建学校 7. 上面的操作产生的数据都通过pickle序列化保存到文件里
架构设计 三层架构 展示层 学员功能 讲师功能 管理员功能 models.py 存储所有角色类
"""为了减轻复杂度(不影响学习,几乎都是相同逻辑) 班级直接等同于课程""" # 管理员视图是我们必须要掌握的!!! 管理员视图 注册 登录 创建学校 创建课程 创建讲师 讲师视图 登录 查看教授课程 选择教授课程 查看课程学生 评判学生分数 学员视图 注册 登录 选择学校 选择课程 查看分数
类产生的对象在保存的时候 自动创建一个与类名一样的文件夹名 将数据保存到该文件夹内 # 如何通过对象获取类对应的字符串名称 obj = Admin('jason',123) # 固定方法 print(obj.__class__) # <class '__main__.Admin'> 类名 print(obj.__class__.__name__) # Admin 字符串