Pyhton基础之多继承、多态

目录

一、多继承

1.1、含义

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

py 复制代码
class Father(object):
	"""父类一"""
	def money(self):
		print("拥有百万财产需要被继承!")

class Mather(object):
	"""父类二"""
	def appearance(self):
		print("拥有绝世容颜被继承")

class Son(Father,Mather):
	"""子类"""
	pass

son = Son()
son.money()
son.appearance()

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

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

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

py 复制代码
class Father(object):
	"""父类一"""
	def weight(self):
		print("爸爸体重一百八")

class Mother(object):
	"""父类二"""
	def weight(self):
		print("妈妈体重九十八")

class Son(Father, Mother):
	"""子类"""
	pass

son = Son()
son.weight()  # 爸爸体重一百八

1.3、方法搜索顺序

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

  1. 多继承有同名方法时,搜索方法时,会先按照__mro__的输出结果,按照从左往右的顺序查找。
  2. 如果在当前类(子类)的方法中找到了,就直接执行,不再搜索
  3. 如果找到最后一个类(object类),还没有找到方法,程序就会报错
py 复制代码
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、概念

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

py 复制代码
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()

二、示例

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

py 复制代码
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、定义格式

py 复制代码
 class 类名:
     @staticmethod
     def 方法名(形参):
         方法体
py 复制代码
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、定义格式

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

4.3、应用场景

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

五、总结

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

  1. 实例方法: 方法内部访问实例属性,方法内部可以通过类名.类属性名来访问类属性
  2. 静态方法: 方法内部不需要访问实例属性和类属性,如果要访问类属性只能通过类名.类属性名访问,不能访问实例属性
  3. 类方法: 方法内部只需要访问类属性,可以通过cls.类属性名访问类属性,不能访问实例属性
相关推荐
默_笙2 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003962 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技2 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时2 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++
奇思妙想聪明勤奋的小羊2 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd1232 天前
2026年第38周GitHub趋势周报
python·科技·github