Python面向对象 (三) 多态及其他

目标

  • 面向对象的三大特性
  • 类属性和实例属性
  • 类方法和静态方法

一 面向对象的三大特性

  • 封装
    – 将属性和方法书写到类的里面的操作即为封装
    – 封装可以为属性和方法添加私有权限
  • 继承
    – 子类默认继承父类的所有属性和方法
    – 子类重写(覆盖)调用父类的属性和方法
  • 多态
    – 传入不同的对象,产生不同的结果

二 多态

2.1 了解多态

多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承).

  • 定义:多态是一种使用对象的方式, 子类重写父类方法, 调用不同的子类创建对象的相同父类方法,可以产生不同的执行结果. 即 传入不同的对象,产生不同的结果.
  • 好处: 调用灵活,有了多态,更容易编写出通用的代码, 做出通用的编程,以适应需求的不断变化.
  • 实现步骤
    – 定义父类,并提供公共方法
    – 定义子类,并重写父类方法
    – 传递子类对象给使用者,可以看到不同子类执行效果不同

2.2 体验多态

[需求] 警察带警犬工作, 警犬有两种工作犬,执行不同的任务
[分析]
0 上归类 警察 追踪犬 缉毒犬 再弄个父类警犬
1 定义父类 提供公共方法
2 定义子类 重写父类同名方法
3 定义警察类 ,这个要 设置形参, 形参.函数名()
[代码]

# --*coding:utf-8*--
"""
[多态]
[需求  验证不同的对象,产生不同的执行结果]
[事件  不同的警犬,协助警察完成工作]
[分析  上归类   父类:警犬 子类:缉毒犬和追踪犬  警察类 ]
[步骤]
1,定义父类 并提供公共方法
2,定义子类 并重写父类方法
3,创建对象,调用不同的功能, 传入不同的对象,观察不同的执行结果
"""
# 定义父类 ,提供公共方法
class 警犬():   #定义父类,提供公用方法,可以四pass空
   def 工作(self):
       print("协助警察工作")
# 定义子类 ,重写父类方法
class 追踪犬(警犬): # 定义子类,重新父类同名方法
   def 工作(self):
       print("追踪坏人")
class 缉毒犬(警犬):
   def 工作(self):
       print("找寻毒品")

class 警察():  #
   def 携带警犬工作(self,狗狗):
       狗狗.工作()

# 创建对象,
老刘=警察()
小白=追踪犬()
大黑=缉毒犬()

#  调用不同的功能,传递不同的子类对象,观察执行结果
老刘.携带警犬工作 (小白)
老刘.携带警犬工作(大黑)
大黑.工作()

三 类属性和实例属性

[实例属性] 实例即对象

3.1 类属性

  • 设置 访问 修改

3.1.1 设置和访问 类属性

  • 类属性 就是拥有的属性,它被该类所有实例对象所有共有
    [代码]

      class Dog():
          tooth=10 # 设置类属性
    
  • 类属性可以使用 实例对象访问
    [代码]

     print(Dog.tooth)  # 直接用类 访问
    
     大白=Dog()
     print(大白.tooth) # 创建对象,并用对象访问
    

类属性的优点
- 不变记录某项始终不变的数据 ,则定义类属性
- 节省空间 实例属性,每个对象占用一份内存空间, 类属性只要一份内存

3.1.2 修改类属性

注意 只能通过类修改,不能通过对象修改,对象修改的只是另外创建了一个实例属性
说人话

  		class Dog():
  			tooth=10
  		大白=Dog()
  • 要修改 类属性 tooth=10
    √ 只能用↓↓ 修改 类名.属性

      Dog.tooth=15  	  		
    

    × 而不能 通过 通过对象修改类属性

      大白.tooth=15	
    
# --*coding:utf-8*--
"""
类属性的设置和访问
"""
# 1 创建类 ,并设置类属性
class Dog():
    tooth=10 # 设置类属性

# 2  访问类属性
print(Dog.tooth)  # (1)直接用类 访问

大白=Dog()
print(大白.tooth) # (2) 创建对象,并用对象访问
print("=========修改的分割线==========")
# 3 修改类属性
Dog.tooth=15  # 可以通过 直接修改类属性
大白.tooth=20 # 通过对象来修改类属性 ,无效
print(Dog.tooth) #  修改成功
print(大白.tooth)  # 只是创建了一个 大白.tooth的对象,并没修改Dog.tooth
print(Dog.tooth)  		

10
10
=修改的分割线==
15
20
15

四 类方法和静态方法

4.1 类方法

4.1.1 类方法特点

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

[思考] 是不是可以理解, 类方法 就是把类的私有属性,return出去的方法, 那么 要有类 私有属性 要有return

4.1.2 类方法使用场景

  • 访问 私有类属性
  • 类方法一般和类私有属性配合使用’
    [代码]
# --*coding:utf-8*--
"""
[类方法 ]
[静态方法]
"""
# 1 定义类,设置私有属性,__
class Dog():
    __tooth=10  # 私有类属性
    age=5   # 类属性
    # 2 类 方法来return这个属性
    @classmethod
    def get_tooth(cls):
        return cls.__tooth

# 3 创建对象
小白=Dog()
print(小白.get_tooth())  # 私有类属性,要return出
print(Dog.age)  # 普通类属性可以直接访问

4.2 静态方法

4.2.1 静态方法的特点

  • 通过装饰器@staticmethod 来装饰,不能传递对象,没有形参self /cls
  • 静态方法能够 通过 实例对象去 访问

4.2.2 使用场景

  • 当方法中既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象(如类属性和方法\创建实例等)时, 定义静态方法
  • 取消不需要的参数传递有利于减少不必要的内存占用和
# --*coding:utf-8*--
"""
[类方法 ]
[静态方法]
"""
# 1 定义类,设置私有属性,__
class Dog():
   __tooth=10  # 私有类属性
   age=5   # 类属性
   # 2 类 方法来return这个属性
   @classmethod
   def get_tooth(cls):
       return cls.__tooth

# 3 创建对象,调用类方法
小白=Dog()
print(小白.get_tooth())  # 私有类属性,要return出
print(Dog.age)  # 普通类属性可以直接访问

# 4 静态方法
class Cat():
   @staticmethod
   def info():
       print("静态方法,不可变?  固定")

# 5 创建对象
大黑=Cat()
#  6 用类访问 也可用对象访问
大黑.info()  #静态方法,不可变?  固定
Cat.info() #静态方法,不可变?  固定

五 总结

请添加图片描述
声明 文字整理 B站视频 Python-七月 [Python 面向对象]
视频地址:
https://www.bilibili.com/video/BV1kT4y1971R?p=41

<think>首先,用户的问题是关于Python面向对象编程中多态的原理、实现方式和应用场景。我需要根据提供的引用内容来构建回答。 参考引用: - 引用[1]:提到多态Python中主要通过动态类型系统(鸭子类型)实现,但继承和方法重写提供了额外的结构和灵活性。 - 引用[2]:强调Python多态无处不在,因为函数参数没有类型限制,只要对象有相应方法即可使用。给出了代码示例,展示了不同类对象调用相同方法的例子。 - 引用[3]:解释了多态作为面向对象大特性之一,依赖于继承,通过子类重写父类方法实现不同的执行结果。提到了实现步骤:定义父类提供公共方法,子类重写父类方法,传递不同子类对象调用相同方法。 系统指令要求: - 所有行内数学表达式使用$...$格式,但这里涉及编程,可能不需要数学表达式。 - 独立公式使用$$...$$,但主题是编程,不太可能需要。 - LaTeX语法正确:同样,没有明显的数学内容。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识:[^1], [^2], [^3]。 用户的问题是:“请问Python面向对象编程中多态的原理、实现方式和应用场景”。我需要覆盖: 1. 原理 2. 实现方式 3. 应用场景 从引用中提取关键点: - 原理:多态的核心是“传入不同的对象,产生不同的结果”。在Python中,这主要通过动态类型系统实现,不依赖严格的类型检查,而是基于对象的能力(即是否有相应方法),这就是鸭子类型。继承和方法重写也支持多态,允许子类提供特定实现。 - 实现方式: - 通过继承:定义父类,子类继承并重写方法。 - 通过鸭子类型:任何对象只要有特定方法,就可以被当作该类型使用,无需显式继承。 示例:在引用[2]中,use_eat函数接受任何有eat方法的对象。 - 应用场景: - 通用代码:编写可以处理多种对象的函数或方法。 - 灵活性:适应需求变化,添加新类时无需修改现有代码。 - 具体示例:如不同的动物类(Duck, Rabbit)或人类子类(Chinese)实现相同方法。 结构化回答: 1. **原理**:解释多态的概念Python中的独特之处。 2. **实现方式**:分继承和鸭子类型两种方式描述。 3. **应用场景**:列举实际用途。 生成相关问题:最后添加相关问题部分。 引用标识:在回答中引用相关段落时,在末尾添加[^n]。 回答结构: - 开头简洁介绍。 - 逐步解释原理、实现方式、应用场景。 - 代码示例:参考引用[2]的代码片段,用代码块展示。 - 结尾总结。 - 添加相关问题。 确保语言中文。 大纲: 1. 介绍多态。 - 定义:多态面向对象编程的大特性之一,指同一个接口或方法在不同对象上产生不同行为。 2. 原理: - Python多态基于动态类型系统(鸭子类型),只要对象有相应方法,就可以使用。 - 不同于静态类型语言(如Java),Python依赖类型声明。 - 引用[1]提到继承和方法重写提供结构和灵活性。 3. 实现方式: - 通过继承和方法重写:创建父类定义方法,子类重写该方法以实现不同行为。 - 通过鸭子类型:函数参数接受任何有特定方法的对象,无需继承关系。 - 代码示例:展示use_eat函数。 4. 应用场景: - 编写通用函数:如数据处理工具。 - 插件系统和框架:允许扩展新类而不修改核心代码。 - 模拟真实世界行为:如游戏中不同角色的动作。 5. 总结:Python多态无处不在,得益于其动态性。 6. 相关问题。 代码块格式:使用Markdown代码块。 相关问题生成: - 基于主题,如: - 如何在Python中实现鸭子类型? - Python多态与其他语言(如Java)的区别? - 多态在大型项目中的应用案例? - 如何处理对象没有所需方法的情况? - 多态与继承的最佳实践? 最终回答: - 使用中文。 - 清晰分段。 - 添加引用标识。 </think>### Python面向对象编程中多态的原理、实现方式和应用场景 在Python面向对象编程中,多态是一种核心特性,它允许同一个接口(如方法或函数)处理不同类型的对象,产生不同的结果。多态提升了代码的灵活性和可扩展性,使其能适应需求变化[^3]。下面我将逐步解释多态的原理、实现方式和应用场景,基于Python的动态类型系统(鸭子类型)和继承机制。 #### 1. **多态的原理** 多态的原理在于“传入不同的对象,产生不同的执行结果”。Python的实现不同于静态类型语言(如Java),它不依赖类型声明,而是基于对象的实际行为(即对象是否有相应的方法)。这称为“鸭子类型”:如果一个对象的行为像鸭子(有`quack()`方法),那它就可以被视为鸭子,无需显式类型检查[^1]。在Python中,多态主要通过动态绑定实现: - 动态类型系统:函数参数不指定类型,任何对象都可传递,只要支持所需的操作。 - 继承与方法重写:子类可以重写父类的方法,提供特定实现,当调用父类方法时,实际执行的是子类版本(如果对象是子类实例)[^2]。 例如,一个父类`Animal`定义`speak()`方法,子类`Dog`和`Cat`重写`speak()`。当调用`speak()`时,对象类型不同,输出也不同,这体现了“一个接口,多种实现”的理念[^3]。 #### 2. **多态的实现方式** 在Python中,多态有多种实现方式,主要分为两类:通过继承和方法重写,以及通过鸭子类型(无继承关系)。以下是具体说明和代码示例。 ##### (1) **通过继承和方法重写** 这是传统的面向对象实现方式,适用于有明确父类-子类关系的场景。步骤包括: - 定义父类,提供公共方法。 - 子类继承父类并重写方法。 - 调用时传递不同子类对象,产生多态行为。 示例代码(参考引用[2]和[^3]): ```python class People: def eat(self): print("人类喜欢吃肉和青菜...") # 父类公共方法 class Chinese(People): def eat(self): print("中国人喜欢吃米饭,面条...") # 子类重写方法,提供特定实现 class Duck: def eat(self): print("鸭子喜欢吃剩饭...") # 无继承关系,但实现相同方法 # 多态调用函数:接收任何有eat方法的对象 def use_eat(obj): obj.eat() # 动态绑定,根据对象类型执行不同eat() # 测试:传入不同对象,产生不同结果 use_eat(Chinese()) # 输出: 中国人喜欢吃米饭,面条... use_eat(Duck()) # 输出: 鸭子喜欢吃剩饭... ``` 在这个例子中: - `Chinese`是`People`的子类,重写了`eat()`方法。 - `Duck`与`People`无继承关系,但实现了`eat()`方法。 - `use_eat()`函数基于传入的对象类型动态调用对应的`eat()`方法,体现了多态[^2]。 ##### (2) **通过鸭子类型(无继承)** Python的动态类型系统使多态无处不在:函数参数不限制类型,任何对象只要实现了所需的方法,就能被处理。这种方式更灵活,适用于异构对象。 - **优点**:无需类型继承,代码更通用。 - **场景**:适合插件式架构或混合类型集合。 示例: ```python class Rabbit: def eat(self): print("兔子喜欢吃萝卜...") # 独立类,无继承 # 通用函数:只要求obj有eat方法 def use_eat(obj): obj.eat() use_eat(Rabbit()) # 输出: 兔子喜欢吃萝卜... ``` 这里,`Rabbit`与`People`无关,但只要它有`eat()`方法,就能被`use_eat()`处理。这展示了Python中“没有多态,处处皆多态”的特点[^2]。 #### 3. **多态的应用场景** 多态Python中广泛应用,主要提升代码复用和系统扩展性: - **通用接口开发**:编写函数或方法时,不绑定具体类,而是要求对象支持特定行为。例如,数据处理工具接受任何实现`save()`方法的对象(如文件、数据库类),简化代码逻辑[^3]。 - **框架和插件系统**:在Web框架(如Django)或游戏引擎中,多态允许开发者添加新组件(如支付网关或角色类),只需确保实现标准接口(如`pay()`或`move()`),无需修改核心代码[^2]。 - **模拟真实世界行为**:在仿真或GUI应用中,不同对象(如按钮、窗口)实现相同方法(如`click()`),调用时产生不同响应,提升灵活性[^1]。 - **测试和Mocking**:在单元测试中,使用Mock对象替代真实对象(如数据库连接),只要它们有相同方法,便于隔离测试[^3]。 #### 总结 Python中的多态原理基于动态类型系统和鸭子类型,核心是“行为优先于类型”。实现方式灵活:既可通过继承和方法重写提供结构,也可通过鸭子类型实现无约束多态。应用场景广泛,包括通用代码、系统扩展和模拟行为。Python多态特性使其代码更简洁、适应性更强[^1][^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值