派生方法实战演练
| import json |
| impprt datetime |
| |
| d = { |
| 't1': datetime.date.today(), |
| 't2': datetime.datetime.today(), |
| 't3': 'jason' |
| } |
| |
| |
| """ |
| 序列化报错 |
| raise TypeError(f'Object of type {o.__class__.__name__} ' |
| TypeError: Object of type date is not JSON serializable |
| """ |
| """ |
| 能够被序列化的数据是有限的>>>:里里外外都必须是下列左边的而类型 |
| +-------------------+---------------+ |
| | Python | JSON | |
| +===================+===============+ |
| | dict | object | |
| +-------------------+---------------+ |
| | list, tuple | array | |
| +-------------------+---------------+ |
| | str | string | |
| +-------------------+---------------+ |
| | int, float | number | |
| +-------------------+---------------+ |
| | True | true | |
| +-------------------+---------------+ |
| | False | false | |
| +-------------------+---------------+ |
| | None | null | |
| +-------------------+---------------+ |
| |
| """ |
| 1.转换方式:手动转类型(简单粗暴) |
| |
| d = { |
| 't1': str(datetime.date.today()), |
| 't2': str(datetime.datetime.today()) |
| } |
| res = json.dumps(d) |
| print(res) |
| |
| 2.转换方式2:派生方法(比较高端) |
| """ |
| 查看dumps源码 注意cls参数 默认传JsonEncoder |
| 查看该类的源码 发现default方法 之后调用dumps |
| 手动传cls= 我们自己写的类 |
| """ |
| |
| class MyJsonEncoder(json.JSONEncoder): |
| def default(self,0): |
| """ |
| :param o: 接收无法被序列化的数据 |
| :return: 返回可以被序列化的数据 |
| """ |
| if isinstance(o, datetime.datetime): |
| |
| return o.strftime('%Y-%m-%d %X') |
| elif isinstance(o,datatime.date): |
| |
| res = json.dumps(d, cls=MyJsonEncoder) |
| print(res) |
面向对象三大特性之封装
| 封装:就是将数据和功能'封装'起来 |
| 隐藏:将数据和功能隐藏起来不让用户直接调用 而是开发一些接口间接调用从而可以在接口内添加额外的一些操作 |
| 伪装: 将类里面的方法伪装成类的数据 |
| class C: |
| @proprety |
| def func(self):pass |
| obj = c() |
| obj.func() |
| """经过封装""" |
| obj.func |
| |
| class MyClass: |
| school_name = '老女孩大学' |
| _ = '嘿嘿嘿' |
| _name = 'tony' |
| '''类在定义阶段 名字前面有两个下划线 那么该名字会被隐藏起来 无法直接访问''' |
| __age = 18 |
| """在python中其实没有真正意义上的隐藏 仅仅是换了个名字而已 _类名__名字""" |
| def __choice_course(self): |
| print('老北鼻正在选课') |
| |
| |
| print(MyClass.School_name) |
| obj = MyClass() |
| print(obj.school_name) |
| print(MyClass._) |
| print(MyClass._name) |
| MyClass.__hobby = 'JDB' |
| print(MyClass.__hobby) |
| obj = MyClass() |
| obj.__addr = '派出所' |
| print(obj.__addr) |
| print(MyClass.__dict__) |
| print(MyClass._MyClass__age) |
| |
| class Person: |
| def __init__(self, name, age, hobby): |
| self.__name = name |
| self.__age = age |
| self.__hobby = hobby |
| |
| def get_info(self): |
| |
| print(f""" |
| 姓名:{self.__name} |
| 年龄:{self.__age} |
| 爱好:{self.__hobby} |
| """) |
| |
| |
| def set_name(self, new_name): |
| if len(new_name) == 0: |
| raise ValueError('写点东西好吗') |
| if new_name.isdigit(): |
| raise ValueError('名字不能是数字') |
| self.__name = new_name |
| |
| obj = Person('jason', 18, 'read') |
| obj.get_info() |
| |
| |
| obj.set_name('') |
| """ |
| 以后我们在编写面向和对象代码类的定义时候 也会看到很多单下划线开头的名字 |
| 表达的意思通常特使不要直接访问 而是查找一下 下面可能定义的接口 |
| """ |
伪装
| BMI指数:衡量一个人的体重与身高对健康影响的一个指标 |
| 体质指数(BMI)=体重(kg)÷身高^2(m) |
| EX:70kg÷(1.75×1.75)=22.86 |
| |
| class Person(object): |
| def __init__(self, name, height, weight): |
| self.name = name |
| self.height = height |
| self.weight = weight |
| @property |
| def BMI(self): |
| return self.weight / (self.height ** 2) |
| |
| |
| p1 = Person('jason', 1.83, 78) |
| p1.BMI() |
| print(p1.BMI) |
| |
| |
| |
| class Foo: |
| def __init__(self, val): |
| self.__NAME = val |
| |
| @property |
| def name(self): |
| return self.__NAME |
| |
| @name.setter |
| def name(self, value): |
| if not isinstance(value, str): |
| raise TypeError('%s must be str' % value) |
| self.__NAME = value |
| |
| @name.deleter |
| def name(self): |
| raise PermissionError('Can not delete') |
| |
| |
| f = Foo('jason') |
| print(f.name) |
| f.name = 'jason123' |
| print(f.name) |
| del f.name |
| f.name = 'jason' |
| f.name = 123 |
| del f.name |
三大特性之多态
| 多态:一种事物的多种形态 |
| 水:液态 固态 气态 |
| 动物:人 猪 猫 狗 |
| class Animal: |
| def spark(self): |
| '''叫的方法''' |
| pass |
| |
| |
| class Cat(Animal): |
| def miao(self): |
| print('喵喵喵') |
| def spark(self): |
| print('喵喵喵') |
| |
| |
| class Dog(Animal): |
| def wang(self): |
| print('汪汪汪') |
| def spark(self): |
| print('汪汪汪') |
| |
| |
| class Pig(Animal): |
| def heng(self): |
| print('哼哼哼') |
| def spark(self): |
| print('哼哼哼') |
| |
| """ |
| 面向对象中多态意思是 一种事物可以有多种形态但是针对相同的功能应该定义相同的方法 |
| 这样无论我们拿到的是哪个具体的事物 都可以通过相同的方法调用功能 |
| """ |
| s1 = 'hello world' |
| l1 = [11, 22, 33, 44] |
| d = {'name': 'jason', 'pwd': 123} |
| print(s1.__len__()) |
| print(l1.__len__()) |
| print(d.__len__()) |
| |
| """ |
| 鸭子类型:只要你看上去像鸭子 走路像鸭子 说话像鸭子 那么你就是鸭子 |
| """ |
| |
| |
| """ |
| 文件 能够读取数据也能够保存数据 |
| 内存 能够读取数据也能够保存数据 |
| 硬盘 能够读取数据也能够保存数据 |
| ...... |
| 一切皆文件 |
| """ |
| class File: |
| def read(self): pass |
| |
| def write(self): pass |
| |
| class Memory: |
| def read(self): pass |
| |
| def write(self): pass |
| |
| class Disk: |
| def read(self): pass |
| |
| def write(self): pass |
| |
| '''python永远提倡自由简介大方 不约束程序员行为 但是多态提供了约束的方法''' |
| import abc |
| |
| |
| class Animal(metaclass=abc.ABCMeta): |
| @abc.abstractmethod |
| def talk(self): |
| pass |
| |
| |
| class Cat(Animal): |
| def talk(self): |
| pass |
| |
| |
| cat = Cat() |
| |
面向对象之反射
| 利用字符串操作对象的数据和方法 |
| 1.hasattr() 重点 |
| 判断对象是否含有某个字符串对应的属性名或方法名 |
| 2.getattr() 重点 |
| 根据字符串获取对象对应的属性名(值)或方法名(函数体代码) |
| 3.setattr() |
| 根据字符串给对象设置或者修改数据 |
| 4.delattr() |
| 根据字符串删除对象里面的名字 |
| |
| |
| class C1: |
| school_name = '小姐姐学院' |
| |
| def choice_course(self): |
| print('大宝贝们正在选课') |
| |
| obj = C1() |
| '''判断某个名字对象是否可以使用(存在)''' |
| |
| target_name = input('请输入对象可能使用的名字>>>:').strip() |
| try: |
| obj.target_name |
| except AttributeError: |
| print('你木有这个名字') |
| """ |
| 字符串的名字跟变量名区别大不大 |
| 'school_name' |
| school_name |
| 非常大 完全不一样 |
| """ |
| |
| 反射:利用字符串操作对象的数据和方法 |
| print(hasattr(obj, 'school_name')) |
| print(getattr(obj, 'school_name')) |
| print(getattr(obj, 'choice_course')) |
| |
| class C1: |
| shcool_name = '小姐姐学院' |
| |
| def choice_course(self): |
| print('大宝贝们正在选课') |
| |
| obj = C1() |
| while True: |
| target_name = input('请输入您想要操作的名字>>>:') |
| if hasattr(obj, target_name): |
| print('恭喜您 系统中有该名字') |
| |
| data_or_func = getattr(obj, target_name) |
| if callable(data_or_func): |
| print('您本次使用的是系统中的某个方法') |
| data_or_func() |
| else: |
| print('您本次使用的是系统中的某个数据') |
| print(data_or_func) |
| else: |
| print('很抱歉 系统中没有该名字') |
反射实战案列
| 1.什么时候应该考虑使用反射 只要需求中出现了关键字 |
| 对象....字符串.... \ |
| |
| 2.实战案列 |
| 1.模拟cmd终端 |
| class WinCmd: |
| def tasklist(self): |
| print(""" |
| 1.学习编程 |
| 2.学习python |
| 3.学习英语 |
| """) |
| def ipconfig(self): |
| print(""" |
| 地址:127.0.0.1 |
| 地址:上海浦东新区 |
| """) |
| def get(self, target_file): |
| print('获取指定文件',target_file) |
| def put(self, target_file): |
| print('上传指定文件',target_file) |
| def server_run(self): |
| print('欢迎进入简易版本cmd终端') |
| while True: |
| target_cmd = input('请输入您的指令>>>:') |
| res = target_cmd.split(' ') |
| if len(res) == 1: |
| if hasattr(self, res[0]): |
| getattr(self, res[0])() |
| else: |
| print(f'{res[0]}不是内部或者外部命令') |
| elif len(res) == 2: |
| if hasattr(self, res[0]): |
| getattr(self, res[0])(res[1]) |
| else: |
| print(f'{res[0]}不是内部或者外部命令') |
| |
| |
| obj = WinCmd() |
| obj.server_run() |
| 2.一切皆对象 |
| |
| import settings |
| print(dir(settings)) |
| |
| useful_dict = {} |
| for name in dir(settings): |
| if name.isupper(): |
| useful_dict[name] = getattr(settings, name) |
| print(useful_dict) |
| |
| |
| |
| |
| |
| |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构