当前位置: 首页 > news >正文

python面向对象高级

一、python中的继承

1.什么是继承

继承是面向对象编程的核心机制,通过父子类结构实现代码重用、功能扩展和层次化设计,使子类能够自动获取父类的属性和方法,并可根据需要进行修改或补充.(一个类使用另一个类的属性,方法)

2.继承的基本语法

假设A类要继承B类中的所有属性和方法(私有属性和私有方法除外)

class B(object): pass class A(B): pass a = A() a.B中的所有公共属性 a.B中的所有公共方法

案例:Person类与Teacher、Student类之间的继承关系

class Person(object): def eat(self): print('i can eat food!') def speak(self): print('i can speak!') class Teacher(Person): pass class Student(Person): pass teacher = Teacher() teacher.eat() teacher.speak() student = Student() student.eat() student.speak()

3.与继承相关的几个概念

继承:一个类从另一个已有的类获得其成员的相关特性,就叫作继承

派生:从一个已有的类产生一个新的类,称为派生

很显然,继承和派生其实就是从不同的方向来描述的相同的概念而已,本质上是一样的

父类:也叫作基类,就是指已有被继承的类

子类:也叫作派生类或扩展类

扩展:在子类中增加一些自己特有的特性,就叫作扩展,没有扩展,继承也就没有意义了

单继承:一个类只能继承自一个其他的类,不能继承多个类,单继承也是大多数面向对象语言的特性

多继承:一个类同时继承了多个父类, (C++、Python等语言都支持多继承)

4.单继承

单继承:一个类只能继承自一个其他的类,不能同时继承多个类。这个类会有具有父类的属性和方法。

# 1、定义一个共性类(父类) class Person(object): pass # 2、定义一个个性类(子类) class Student(Person): pass

5.单继承(多层继承)

在Python继承中,如A类继承了B类,B类又继承了C类。则根据继承的传递性,则A类也会自动继承C类中所有属性和方法(公共)

class C(object): def func(self): print('我是C类中的相关方法func') class B(C): pass class A(B): pass a = A() a.func()

8.多继承

Python语言是少数支持多继承的一门编程语言,所谓的多继承就是允许一个类同时继承自多个类的特性。

class B(object): pass class C(object): pass class A(B, C): pass a = A() a.B中的所有属性和方法 a.C中的所有属性和方法

9.子类重写父类属性和方法

重写也叫作覆盖,就是当子类成员与父类成员名字相同的时候,从父类继承下来的成员会重新定义

此时,通过子类实例化出来的对象访问相关成员的时候,真正其作用的是子类中定义的成员

注意: 如果子类中的属性和方法与父类中的属性或方法同名,则子类中的属性或方法会对父类中同名的属性或方法进行覆盖(重写)

class Father(object): # 属性 # 方法 class Son(Father): # 默认继承父类属性和方法 # 自己的属性和方法

10.super()调用父类属性和方法

super()完整写法:super(当前类名,self).属性或方法,在python3以后版本中,调用父类的属性和方法我们只需要使用super().属性或super().方法名()就可以完成调用了

class Car(object): def __init__(self, brand, model, color): self.brand = brand self.model = model self.color = color def run(self): print('i can run') class GasolineCar(Car): def run(self): print('i can run with gasoline') class ElectricCar(Car): def __init__(self, brand, model, color, battery): super().__init__(brand, model, color) # 电池属性 self.battery = battery def run(self): print(f'i can run with electric,i have a {self.battery} + "kwh battery"') bwm = GasolineCar('宝马', 'X5', '白色') bwm.run() tesla = ElectricCar('特斯拉', 'Model S', '红色', 70) tesla.run()

11.MRO属性或MRO方法:方法解析顺序

MRO(Method Resolution Order):方法解析顺序,我们可以通过类名.__mro__类名.mro()获得“类的层次结构”,方法解析顺序也是按照这个“类的层次结构”寻找到。

二、python中的多态

1.什么是多态

概念:同种事物做同一件事的不同形态,这就是多态

好处:扩展性强,灵活性强

真正意义上的多态,必须满足以下3个条件:

  1. 有继承
  2. 有重写
  3. 有父类引用指向子类对象

注意:Python 的"伪多态"实际上是其动态特性和鸭子类型系统的体现,虽然功能上可以实现类似多态的效果。Python由于缺乏编译时类型检查和强制接口约束,因此被称为"伪多态"。

2.多态的代码实现

''' 首先定义一个父类,其可能拥有多个子类对象。当我们调用一个公共方法(接口)时,传递的对象不同,则返回的结果不同。 ''' class Fruit(object): def makejuice(self): print('i can make juice') class Apple(Fruit): # 重写父类方法 def makejuice(self): print('i can make apple juice') class Banana(Fruit): # 重写父类方法 def makejuice(self): print('i can make banana juice') class Orange(Fruit): # 重写父类方法 def makejuice(self): print('i can make orange juice') # 定义一个公共接口(专门用于实现榨汁操作) def service(obj): # obj要求是一个实例化对象,可以传入苹果对象/香蕉对象 obj.makejuice() # 调用公共方法 service(Orange())

三、面向对象其他特征

1.类属性

Python中,属性可以分为实例属性类属性

类属性就是 类对象中定义的属性,它被该类的所有实例对象所共有。通常用来记录 与这类相关 的特征

类属性必须定义在类内部,但所有方法之外,通常位于类的开头部分

2.类属性代码实现

lass Person(object): # 定义类属性count count = 0 # 定义一个__init__魔术方法,用于进行初始化操作 def __init__(self, name): self.name = name # 对count类属性进行+1操作,用于记录这个Person类一共生成了多少个对象 Person.count += 1 # 1、实例化对象p1 p1 = Person('Tom') p2 = Person('Harry') p3 = Person('Jennifer') # 2、在类外部输出类属性 print(f'我们共使用Person类生成了{Person.count}个实例对象')

3.类方法

为什么需要类方法,在面向对象中,特别强调数据封装性。所以不建议直接在类的外部对类属性进行直接获取。所以我们如果想操作类属性,建议使用类方法

class Tool(object): # 定义一个类属性count count = 0 # 定义一个__init__初始化方法 def __init__(self, name): self.name = name Tool.count += 1 # 封装一个类方法:专门实现对Tool.count类属性进行操作 @classmethod def get_count(cls): print(f'我们使用Tool类共实例化了{cls.count}个工具') t1 = Tool('斧头') t2 = Tool('榔头') t3 = Tool('铁锹') Tool.get_count()

4.静态方法

在开发时,如果需要再类中封装一个方法,这个方法既不需要访问实例属性或者调用实例方法,也不需要访问类属性或者调用类方法,这个时候可以把这个方法封装成一个静态方法

PS:通常用来做说明书

# 开发一款游戏 class Game(object): # 开始游戏,打印游戏功能菜单 @staticmethod def menu(): print('1、开始游戏') print('2、游戏暂停') print('3、退出游戏') # 开始游戏、打印菜单 Game.menu()
http://www.jsqmd.com/news/569365/

相关文章:

  • Phi-4-mini-reasoning 3.8B:轻量级人工智能模型的部署效率展示
  • 小白友好!MinerU镜像部署指南,PDF解析不再求人
  • GB28181视频监控平台EasyCVR助力景区数字化转型,打造一体化视频监控解决方案
  • 8种Prompt优化技巧:解决大模型输出不稳定痛点
  • 中国企业DevOps工具链选型进入多维权衡时代:安全、协同与生态成关键指标
  • AI教程-提示词(视角,构图,光影控制,色调)
  • MusePublic圣光艺苑惊艳效果:大气照明+表达性纹理细节放大展示
  • 忍者像素绘卷保姆级教程:强制像素化标签自动补全构图/线条/色彩权重
  • 果蔬大棚温湿度监测系统(有完整资料)
  • Proteus 8实战:手把手教你搭建ATmega16流水灯仿真,并联动真实代码调试
  • intv_ai_mk11开源模型教程:7B Llama架构对话机器人在GPU云上的安全沙箱实践
  • RAG应用成本优化:3个实战方案降本60%
  • Kandinsky-5.0-I2V-Lite-5s与目标检测结合:YOLOv5动态视频标注应用
  • YOLOFuse实战案例:如何利用红外+RGB融合提升森林火情监测精度
  • Sonic数字人常见问题解决:视频模糊、嘴形不匹配?看这里一键搞定
  • 奥比中光深度相机SDK环境配置避坑指南:从安装到运行的全流程解析
  • 生成式AI重构软件工程:工程师的价值重生
  • 大模型Fine-tuning全流程:小数据集也能练出高精度模型
  • 神州数码无线网络(AC+AP)实战部署与优化指南
  • OCR工具:执行式AI识别图片文字
  • Qwen-Image-2512-SDNQ开源可部署:科研团队AI绘图实验平台搭建
  • PasteMD体验报告:极简界面+强大功能,这才是生产力工具该有的样子
  • MinerU智能文档理解镜像:财务报表自动识别实战体验
  • Qwen3-ASR-0.6B部署指南:无需代码,3分钟搭建个人语音转文字工具
  • STEP3-VL-10B保姆级教程:Supervisor配置文件详解+自定义启动参数设置
  • M2LOrder模型Python入门教学:从零到一的代码实践指南
  • Ostrakon-VL多模态模型实战:价签解密+商品定位双任务联合推理演示
  • 基于STM32的FireRedASR Pro离线语音识别方案设计与实现
  • YOLO-v5实战:用预训练模型快速检测图片中的物体
  • Next.js服务端渲染性能优化:5个实战技巧提效40%