Python面向对象三大特性(三)--多态

本文通过具体实例讲解了Python中的多态概念,演示了如何使用不同支付工具进行支付,并展示了文件系统的抽象类设计,包括读写操作的不同实现。

目录

因为在Python中多态的概念已经弱化了很多,所以我在这不多加介绍了,大家来看一个实例来感受一下就行了

1.多态

2.使用不同的支付工具给商店支付钱

(1)思路:

首先人去商店买东西,要付钱,先要有人

然后人要选择支付工具,要有支付方式:

我们最近的支付方式有:支付宝支付,苹果支付........

最后人消费的这个行为,人用什么支付工具,要支付多少钱

(2)代码:

3.文件系统

(1)要求:

(2)代码:


因为在Python中多态的概念已经弱化了很多,所以我在这不多加介绍了,大家来看一个实例来感受一下就行了

1.封装:https://blog.youkuaiyun.com/g_optimistic/article/details/86516190

2.继承:https://blog.youkuaiyun.com/g_optimistic/article/details/86490048


1.多态

多态就是不同子类对象调用父类的方法产生不同的结果。

2.使用不同的支付工具给商店支付钱

(1)思路:

  • 首先人去商店买东西,要付钱,先要有人

  • 然后人要选择支付工具,要有支付方式:

  • 我们最近的支付方式有:支付宝支付,苹果支付........

  • 最后人消费的这个行为,人用什么支付工具,要支付多少钱

(2)代码:

import abc


class Pay(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def pay(self, money): pass


class Alipay(Pay):
    def pay(self, money):
        print('支付宝到账{}元'.format(money))


class ApplePay(Pay):
    def pay(self, money):
        print('苹果支付{}元'.format(money))


class Person(object):
    def consumption(self, pay, money):
        pay.pay(money)


person = Person()
alipay = Alipay()
apple_pay = ApplePay()
person.consumption(alipay, 200)  # 支付宝到账200元
person.consumption(apple_pay, 100)  # 苹果支付100元

3.文件系统

(1)要求:

由小组长控制读和写

要求zs使用word,ls使用txt

(2)代码:

from abc import ABCMeta, abstractmethod


class File(metaclass=ABCMeta):
    @abstractmethod
    def read(self): pass

    @abstractmethod
    def write(self): pass


class Word(File):
    def read(self):
        print('很优雅的读...')

    def write(self):
        print('很优雅的写...')


class Txt(File):
    def read(self):
        print('很粗鲁的读...')

    def write(self):
        print('很粗鲁的写...')


zs = Word()
zs.read()  # 很优雅的读...
zs.write()  # 很优雅的写...
ls = Txt()
ls.read()  # 很粗鲁的读...
ls.write()  # 很粗鲁的写...

 

<think> 我们正在讨论Python中的面向对象三大特性:封装、继承和多态。根据用户要求,我们需要详细解释这个概念,并结合引用中的Python示例进行说明。注意,引用[1]提到封装是描述现实世界,引用[2]和引用[4]展示了继承的传递性和方法重写(多态),引用[3]则重点说明了封装的实现(使用双下划线表示私有属性)。 我们将按照以下结构组织内容: 1. 封装:定义、目的、Python中的实现(私有成员) 2. 继承:定义、继承传递性、方法重写(作为多态的基础) 3. 多态:定义、在Python中的体现(重写和鸭子类型) 注意:在Python中,多态的实现与其他语言(如Java)不同,它主要依赖于鸭子类型(duck typing)和方法重写。 开始编写回答: </think> ### Python面向对象三大特性详解:封装、继承、多态 #### 一、封装(Encapsulation) **概念**:将数据(属性)和操作数据的方法(行为)绑定在类中,通过访问控制隐藏内部实现细节,仅暴露必要接口。这是程序对现实世界的抽象表达(如"人"类封装姓名、年龄属性和行走方法)[^1]。 **Python实现机制**: 1. **私有成员**:双下划线前缀`__`实现属性隐藏 2. **公有接口**:提供方法控制属性访问 ```python class BankAccount: def __init__(self): self.__balance = 0 # 私有属性(实际变为_BankAccount__balance) def deposit(self, amount): if amount > 0: self.__balance += amount # 类内可访问 def get_balance(self): # 公有接口 return self.__balance account = BankAccount() account.deposit(100) print(account.get_balance()) # 输出100 print(account.__balance) # 报错:AttributeError(外部不可直接访问) ``` **设计原则**: - 最小暴露原则:成员变量默认设为私有(`__`前缀) - 接口隔离:通过方法暴露功能,隐藏实现复杂度 - 数据验证:在方法中增加业务逻辑(如存款金额校验) #### 二、继承(Inheritance) **概念**:子类自动获取父类的属性和方法,实现代码复用和层次化扩展。继承具有传递性:子类继承父类,父类继承祖父类,则子类拥有所有祖先类特性[^4]。 **Python实现机制**: ```mermaid classDiagram Animal <|-- Cat Cat <|-- Jiqimao class Animal { +eat() +drink() +sleep() } class Cat { +yell() } class Jiqimao { +speak() +eat() 重写方法 } ``` **关键特性**: 1. **继承传递性**: ```python class Person: def run(self): return "我可以跑步" class Male(Person): def repair(self): return "我可以修理汽车" class Boy(Male): # 继承Male(间接继承Person) def play(self): return "我可以玩耍" boy = Boy() print(boy.run()) # 输出:我可以跑步(继承自Person) print(boy.repair()) # 输出:我可以修理汽车(继承自Male) ``` 2. **方法重写(Override)**:子类覆盖父类方法实现多态 ```python class Animal: def eat(self): print("吃食物") class Cat(Animal): def eat(self): # 重写父类方法 print("吃鱼") cat = Cat() cat.eat() # 输出"吃鱼"而非"吃食物" ``` #### 多态(Polymorphism) **概念**:同一接口在不同对象上呈现不同行为,主要依赖方法重写和鸭子类型实现。 **实现方式**: 1. **方法重写(运行时多态)**: ```python class Payment: def pay(self): pass class WechatPay(Payment): def pay(self): # 重写实现 print("微信支付") class Alipay(Payment): def pay(self): # 重写实现 print("支付宝支付") def process_payment(payment_obj): # 统一调用接口 payment_obj.pay() process_payment(WechatPay()) # 输出"微信支付" process_payment(Alipay()) # 输出"支付宝支付" ``` 2. **鸭子类型(编译时多态)**: ```python class Duck: def sound(self): print("嘎嘎嘎") class Dog: def sound(self): # 无需继承相同父类 print("汪汪汪") def make_sound(animal): # 只要实现sound()方法即可 animal.sound() make_sound(Duck()) # 输出"嘎嘎嘎" make_sound(Dog()) # 输出"汪汪汪" ``` #### 四、三大特性协同关系 ```mermaid graph LR A[封装] -->|构建独立类| B[继承] B -->|建立类层次| C[多态] C -->|统一调用接口| A ``` - **封装是基石**:构建高内聚的类单元(如银行账户类) - **继承是延伸**:实现代码复用(如`Boy`复用`Person`功能) - **多态是桥梁**:提供灵活的行为适配(如统一支付接口) > Python通过动态类型和鸭子类型机制,使多态实现更加灵活,不强制要求继承关系[^2] --- ### 相关问题 1. Python中通过`__`前缀定义的私有成员真的无法从外部访问吗?其底层实现原理是什么?[^3] 2. 当子类重写父类方法时,如何调用被覆盖的父类方法实现?`super()`函数有哪些使用技巧? 3. 鸭子类型(Duck Typing)与传统的基于继承的多态有何本质区别?在什么场景下更适合使用鸭子类型? 4. 如何利用Python的`@property`装饰器实现更安全的封装?请举例说明属性校验场景
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值