今日内容概要
# 如果想要修改一个类的元类 需要通过关键字参数指定 class MyClass(metaclass=类名): pass # 如何去干涉类和对象的创建过程 写类继承元类type class MyTypeClass(type): pass """如果想要干涉类的创建过程 可以在自定义元类中重写__init__""" # 突破口>>>:__call__方法 对象加括号执行产生对象类里面的双下call 类加括号执行产生类的元类里面的双下call 元类中的双下call方法 该方法绝对了类的对象能否顺利的产生 对象的产生过程 先执行元类里面的双下call 然后调用类里面的双下init 元类中的双下call执行过程 1.先产生一个空对象 __new__方法用于产生一个空对象 2.调用类里面的双下init
作业讲解
class MyTpeyClass(type): def __call__(self, *args, **kwargs): args = [i.upper() for i in args] return super().__call__(*args, **kwargs) class MyClass(metaclass=MyTpeyClass): def __init__(self, name, pwd): self.name = name self.pwd = pwd def __setattr__(self, key, value): self.__dict__[key] = value.upper() a = MyClass('zqh', 'kny') print(a.name) print(a.pwd) a.hobby='mkbk' print(a.hobby) class MyClasstype(type): def __call__(self, *args, **kwargs): args1 = [] if args: for i in range(len(args)): args1.append(args[i].upper()) if kwargs: for i in kwargs: kwargs[i]=kwargs[i].upper return super().__call__(*args1, **kwargs) class MyClass(metaclass=MyClasstype): def __init__(self, name, pwd): self.name = name self.pwd = pwd print(MyClass) b=MyClass('zqh','mkbk') print(b.name) print(b.pwd)
设计模式
在IT行业中设计模式总共有23种 可以分为三大类 1.创建型 2.结构型 3.行为型 单例模式的意思是一个类只能产生一个对象 用于节省资源 应用场景: 有一个类中有很多非常牛逼的绑定给对象的方法 我们需要在很多地方使用它 那么不同的程序员来用不知道有没有产生对象 所以自己会创建一个新对象 如此往复则会造成资源的浪费 接下来要学的就是设计模式之单例模式 class A: count = None # obj def __init__(self,name): self.name = name def __new__(cls, *args, **kwargs): if not cls.count: cls.count = object.__new__(cls) # object.__new__(cls)返回一个对象 return cls.count a = A("张三") b = A("张2") c = A("张1") print(id(a),id(b),sep=' ') print(a.name) print(b.name) print(c.name) 装饰器写一个单例: def f1(cls): count = {} def f2(*args,**kwargs): if cls not in count: count[cls] = cls(*args,**kwargs) print(count) return count[cls] return f2 @f1 class A(object): def __init__(self,name): self.name =name @f1 class B(object): def __init__(self,name): self.name = name a = A('aaa') b = A('bbb') aa = B('AAA') bb = B('BBB') print(id(aa),id(bb),sep=' ') 第三种可以简单口述一下: 就是创建一个py文件在文件中定义一个类实例化这个类 在另一个文件导入写类的这个文件 这样也可以形成一个单例模式 eg:这是一个a文件写好的 class A(object): def __init__(self,name): self.name = name a = A('aaa') 在b文件中导入即可 from a import a 导入这个对象形成单例 单例模式的意思是一个类只能产生一个对象 用于节省资源
pickle模块
pickle模块和json模块有几个相同的方法 他们都有 lowd lowds dump dumps 如何将对象保存到文件 并且取出来之后还可以使用对象的功能? 这就用到了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)
选课系统项目分析
# 目的:为了练习面向对象编程 # 项目分析: 选课系统 角色:学校、学员、课程、讲师 要求: 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 字符串