面向对象的魔法对象
| 魔法方法:类中定义的双下方法都成为魔法方法 |
| 不需要认为调用 在特定的条件下会自动触发运行 |
| |
| __init__创建空对象之后自动触发给对象添加独有的数据 |
| |
| 1.__init__ |
| 对象添加独有数的时候自动触发 |
| 2.__str__ |
| 对象被执行打印操作的时候自动触发 |
| 3.__call__ |
| 对象加括号调用的时候自动触发 |
| 4.__getattr__ |
| 对象点不存在的名字的时候自动触发 |
| 5.__getattribute__ |
| 对象点名字就会自动触发 有它的存在就不会执行上面的__getattr__ |
| 6.__setattr__ |
| 给对象添加或者修改数据的时候自动触发 对象.名字 = 值 |
| 7.__enter__ |
| 当对象被当作with上下文管理操作的开始自动触发 并且该方法返回什么 as后面的变量名就会接收到什么 |
| 8.__exit__ |
| with上下文管理语法运行完毕之后自动触发(子代码结束) |
魔法方法笔试题
| 1.补全下列代码使运行不报错即可 |
| class Context: |
| pass |
| with Context() as f: |
| f.do_something() |
| |
| class Context: |
| def do_something(self): |
| pass |
| def __enter__(self): |
| return self |
| def __exit__(self, exc_type, exc_val, exc_tb): |
| pass |
| with Context() as f: |
| f.do_something() |
| |
| |
| 2.自定义字典类型并让字典能够通过句点符的方式操作键值对 |
| class MyDict(dict): |
| def __setattr__(self,key,value): |
| selfp[key] = value |
| |
| def __getattr__(self,item): |
| return self.get(item) |
| obj = MyDict() |
| obj.name = 'jason' |
| obj.pwd = 18 |
| obj.hobby = 'read' |
| |
| print(obj.name) |
| print(obj.pwd) |
| print(obj.hobby) |
| print(obj.__dict__) |
| |
元类简介
| """推导步骤1:如何查看数据的数据类型""" |
| s1 = 'hello world' |
| l1 = [11, 22, 33, 44] |
| d1 = {'name': 'jason', 'pwd': 123} |
| t1 = (11, 22, 33, 44) |
| print(type(s1)) |
| print(type(l1)) |
| print(type(d1)) |
| print(type(t1)) |
| |
| """推导步骤2:其实type方法是用来查看产生对象的类名""" |
| class Student: |
| pass |
| obj = Student() |
| print(type(obj)) |
| |
| """推导步骤3:python中一切皆对象 我们好奇type查看类名显示的是什么""" |
| class Student: |
| pass |
| obj = Student() |
| print(type(obj)) |
| print(type(Student)) |
| class A:pass |
| class B:pass |
| print(type(A), type(B)) |
| |
| """结论:我们定义的类其实都是由type类产生的>>>:元类(产生类的类)""" |
创建类的两种方式
| |
| class Teacher: |
| school_name = '清华大学' |
| def func1(self):pass |
| print(Teacher) |
| print(Teacher.__dict__) |
| |
| cls = type('Student', (object,), {'name':'jason'}) |
| print(cls) |
| print(cls.__dict__) |
| """ |
| 了解知识:名称空间的产生 |
| 1.手动写键值对 |
| 针对绑定方法不好定义 |
| 2.内置方法exec |
| 能够运行字符串类型的代码并产生名称空间 |
| """ |
元类定制类的产生行为
| """ |
| 推导 |
| 对象是由类名加括号产生的 __init__ |
| 类是由元类加括号产生的 __init__ |
| """ |
| """所有的类必须首字母大写 否则无法产生""" |
| |
| class MyMetaClass(type): |
| def __init__(self, what, bases=None, dict=None): |
| print('what', what) |
| print('bases', bases) |
| print('dict', dict) |
| if not what.istite(): |
| raise TypeError('你是不是python程序员 懂不懂规矩 类名首字母应该大写啊!!!') |
| super().__init__(what, bases, dict) |
| |
| |
| class myclass(metaclass=MyMetaClass): |
| desc = '元类其实很有趣 就是有点绕'. |
| |
| class Student(metaclass=MyMetaClass): |
| info = '我是学生 我很听话' |
| print(Student) |
| print(Student.__dict__) |
元类定制对象的产生行为
| """ |
| 推导 |
| 对象加括号会执行产生该对象类里面的__call__ |
| 类加括号会执行产生该类的类里面的 |
| __call__ |
| """ |
| |
| """给对象添加独有数据的时候 必须采用关键字传参""" |
| |
| class MyMetaClass(type): |
| def __call__(self, *args, **kwargs): |
| |
| |
| |
| |
| |
| if args: |
| raise TypeError("你怎么回事 Jason要求对象的独有数据必须按照关键字参数传参 我看你是不想干了!!!") |
| return super().__call__(*args, **kwargs) |
| |
| |
| class Student(metaclass=MyMetaClass): |
| def __init__(self,name,age,gender): |
| |
| self.name = name |
| self.age = age |
| self.gender = gender |
| |
| obj = Student('jason', 18, 'male') |
| obj = Student(name='jason',age= 18,gender= 'male') |
| print(obj.__dict__) |
魔法方法之双下new
| class MyMetaClass(type): |
| def __call__(self, *args, **kwargs): |
| |
| obj = self.__new__(self) |
| |
| self.__init__(obj,*args,**kwagrs) |
| |
| return obj |
| |
| class Student(metaclass=MyMetaClass): |
| def __init__(self,name): |
| self.name = name |
| |
| obj = Student('jason') |
| print(obj.name) |
| """ |
| __new__可以产生空对象 |
| """ |
设计模式简介
| 1.设计模式 |
| 前人通过大量的验证创建出来解决一些问题的固定高效方法 |
| 2.IT行业 |
| 23种 |
| 创建型 |
| 结构型 |
| 行为型 |
| ps:网上自行浏览 |
| 3.单列模式 |
| 类加括号无论执行多少次永远只会产生一个对象 |
| 目的: |
| 当类中有很多非常强大的方法 我们在程序中很多地方都需要使用 |
| 如果不做单列 会产生很多无用的对象浪费存储空间 |
| 我们想着使用单列模式 整个程序就用一个对象 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构