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

Pyhton基础之多继承、多态

目录

  • 一、多继承
    • 1.1、含义
    • 1.2、多继承父类存在同名方法
    • 1.3、方法搜索顺序
    • 1.4、多继承弊端
  • 二、多态
    • 2.1、概念
    • 二、示例
  • 三、静态方法
    • 3.1、概念
    • 3.2、定义格式
    • 3.3、作用
    • 3.4、应用场景
  • 四、类方法
    • 4.1、概念
    • 4.2、定义格式
    • 4.3、应用场景
  • 五、总结

一、多继承

1.1、含义

多继承就是子类可以拥有多个父类,并且具有所有父类的属性和方法。

class Father(object):"""父类一"""def money(self):print("拥有百万财产需要被继承!")class Mather(object):"""父类二"""def appearance(self):print("拥有绝世容颜被继承")class Son(Father,Mather):"""子类"""passson = Son()
son.money()
son.appearance()

多继承可以让子类同时具有多个父类的属性和方法。

1.2、多继承父类存在同名方法

如果多个父类之间存在同名的方法时,采用就近原则,先继承谁就用谁的方法。但是开发时,应尽量避免这种容易产生混淆的情况。

class Father(object):"""父类一"""def weight(self):print("爸爸体重一百八")class Mother(object):"""父类二"""def weight(self):print("妈妈体重九十八")class Son(Father, Mother):"""子类"""passson = Son()
son.weight()  # 爸爸体重一百八

1.3、方法搜索顺序

Python中内置属性__mro__可以查看方法搜索顺序,用于确定子类调用方法的顺序。

  1. 多继承有同名方法时,搜索方法时,会先按照__mro__的输出结果,按照从左往右的顺序查找。
  2. 如果在当前类(子类)的方法中找到了,就直接执行,不再搜索
  3. 如果找到最后一个类(object类),还没有找到方法,程序就会报错
class Father(object):"""父类一"""def weight(self):print("爸爸体重一百八")
class Mother(object):"""父类二"""def weight(self):print("妈妈体重九十八")
# class Son(Father, Mother):
class Son(Mother, Father):"""子类"""def weight(self):print("自己体重一百二")
son = Son()  print(Son.__mro__)
#(<class '__main__.Son'>, <class '__main__.Mother'>, <class '__main__.Father'>, <class 'object'>)

1.4、多继承弊端

容易引发冲突,会导致代码设计的复杂度增加。

二、多态

2.1、概念

多态指的是:同一种行为,具有多个不同的表现形式。多态的两大前提是:继承和重写。

class Animal(object):"""父类:动物类"""def shout(self):print("动物会叫!")class Cat(Animal):"""子类一:猫类"""def shout(self):     # 重写父类同名方法print("小猫喵喵喵")class Dog(Animal):"""子类二:狗类"""def shout(self):     # 重写父类同名方法print("小狗汪汪汪")class Pig(Animal):"""子类三:猪类"""def shout(self):print("小猪哼哼哼")cat = Cat()
cat.shout()
dog = Dog()
dog.shout()
pig = Pig()
pig.shout()

二、示例

同一种调用方式,能够根据传入对象的不同,产生不同的执行结果

class Animal(object):"""父类:动物类"""def shout(self):print("动物会叫!")class Cat(Animal):"""子类一:猫类"""def shout(self):     # 重写父类同名方法print("小猫喵喵喵")class Dog(Animal):"""子类二:狗类"""def shout(self):     # 重写父类同名方法print("小狗汪汪汪")class Pig(Animal):"""子类三:猪类"""def shout(self):print("小猪哼哼哼")# 定义一个统一的接口
def test(obj):           # obj:普通形参obj.shout()
# 实例化子类对象
cat = Cat()
dog = Dog()
pig = Pig()
# 调用接口,多种执行结果
test(cat)                # 传入的是cat对象,调用cat对象的shout方法
test(dog)
test(pig)

三、静态方法

3.1、概念

使用装饰器@staticmethod来进行修饰,静态方法既不需要传递类对象也不需要传递实例对象(形参没有self/cls参数限制)。
注意: 静态方法与类无关,可以将其转换成普通函数使用。

3.2、定义格式

 class 类名:@staticmethoddef 方法名(形参):方法体
class Person(object):@staticmethod    # 静态方法:类中的函数,不需要实例def study():print("人类会学习")# 注意: 静态方法既可以使用对象访问又可以使用类访问
Person.study()
pe = Person()
pe.study()class Person(object):@staticmethod         # 静态方法:类中的函数,不需要实例def study(name):print(f"{name}会学习")
Person.study('小明')
pe = Person()
pe.study('小明')

3.3、作用

取消不需要的参数传递,有利于减少不必要的内存占用和性能消耗。

3.4、应用场景

当方法中既不需要使用实例对象,也不需要使用类对象时,定义静态方法。

四、类方法

4.1、概念

使用装饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数。

4.2、定义格式

 class 类名:@classmethoddef 方法名(形参):方法体
# 注意:类方法内部可以访问类属性,或者调用其他的类方法
class Person(object):name = '小明'           # 类属性@classmethoddef sleep(cls):         # cls代表类对象print(cls)print("人类在睡觉")print(cls.name)
print(Person)
Person.sleep()

4.3、应用场景

类方法一般和类属性配合使用,当方法中需要使用类时也可以定义类方法

五、总结

三种方法内部访问属性对比总结:

  1. 实例方法: 方法内部访问实例属性,方法内部可以通过类名.类属性名来访问类属性
  2. 静态方法: 方法内部不需要访问实例属性和类属性,如果要访问类属性只能通过类名.类属性名访问,不能访问实例属性
  3. 类方法: 方法内部只需要访问类属性,可以通过cls.类属性名访问类属性,不能访问实例属性

文章转载自:

http://FCjKwJNq.mLpmf.cn
http://DpCvSHOc.mLpmf.cn
http://YPrbTKYZ.mLpmf.cn
http://F4hcIGN8.mLpmf.cn
http://HdXpe9f2.mLpmf.cn
http://3bEWg25R.mLpmf.cn
http://CWmNQIRF.mLpmf.cn
http://WYMe8CCP.mLpmf.cn
http://J1yz1iwu.mLpmf.cn
http://7VzTG9c9.mLpmf.cn
http://dOU6g7cx.mLpmf.cn
http://m5x9d01K.mLpmf.cn
http://O2YcFgKA.mLpmf.cn
http://yiiksulm.mLpmf.cn
http://MquMwGAF.mLpmf.cn
http://3VpTDn4d.mLpmf.cn
http://Grb8ssWr.mLpmf.cn
http://pmyGTl6i.mLpmf.cn
http://PLUbugML.mLpmf.cn
http://S5QWnblf.mLpmf.cn
http://VgqdzCYI.mLpmf.cn
http://czsFzvpx.mLpmf.cn
http://QTORSVRP.mLpmf.cn
http://IY97olmk.mLpmf.cn
http://OfEgHceG.mLpmf.cn
http://JRt5ub7p.mLpmf.cn
http://TQvyLJRp.mLpmf.cn
http://XjzFx24x.mLpmf.cn
http://jiYi3pIA.mLpmf.cn
http://3OC3bxLb.mLpmf.cn
http://www.dtcms.com/a/372638.html

相关文章:

  • AOSP Framework开发的一些超方便的快捷命令
  • 移动高清盒子CM311-5-内存大小区分参考指南
  • 在 VirtualBox 虚拟机中安装 Fedora CoreOS 操作系统
  • 【SLAM论文笔记】SplaTAM论文小结
  • shell编程之文本三剑客grep、sed、awk
  • 开始 ComfyUI 的 AI 绘图之旅-文生图(一)
  • 有哪些任务可以使用无监督的方式训练深度学习模型?
  • 从零开始构建图注意力网络:GAT算法原理与数值实现详解
  • FastAPI基础
  • 通过SSH来推送本地文件夹到Github
  • 风锐统计——让数据像风一样自由!(十)——关联研究全自动分析
  • AutoGen快速入门
  • v$lock 查找锁 locked objects ORA-54 dblink
  • Daily算法刷题【面试经典150题-2️⃣】
  • Ucloud技术支持问题
  • 调试 cuda kernel
  • OpenLayers常用控件 -- 章节九:比例尺控件教程
  • 李沐深度学习论文精读(一)AlexNet + ResNet
  • CMake构建C++项目,报错“CMake Error CMAKE_C_COMPILER not set, after EnableLanguage”
  • 2025最新超详细FreeRTOS入门教程:第五章 FreeRTOS信号量
  • 安卓逆向(二)相关问题及解决方案
  • 自学嵌入式第37天:MQTT协议
  • daily notes[11]
  • Qt中QProxyStyledrawControl函数4个参数的意义
  • AutoHotkey识别图片
  • 【数学建模】在烟雾导弹遮蔽模型中的实际参考文献
  • 快速了解word2vec模型
  • 关于高并发的一连串问题分析(未完成)
  • Ansible Playbook 核心配置实操指南:主机清单引用、并行执行与模块化组织
  • 2025年金融专业人士职业认证发展路径分析