【Python】继承与多态

【Python】继承与多态_第1张图片

知识目录

  • 一、写在前面✨
  • 二、继承
  • 三、多态
  • 四、Account和FreeChecking类的实现
  • 五、总结撒花

一、写在前面✨

大家好!我是初心,希望我们一路走来能坚守初心!

今天跟大家分享的文章是 Python中的继承与多态 ,希望能帮助到大家!本篇文章收录于 初心 的 Python从入门到精通 专栏。

个人主页:初心%个人主页
个人简介:大家好,我是初心,和大家共同努力
欢迎大家:这里是CSDN,我记录知识的地方,喜欢的话请三连,有问题请私信

山重水复疑无路,柳暗花明又一村。 —— 陆游「游山西村」

二、继承

继承是一种创建新的类的方式,新创建的叫子类,继承的叫父类、超类、基类。继承的特点就是子类可以使用父类的属性(特征、技能)。 继承是类与类之间的关系。

继承可以减少代码冗余、提高重用性。

语法:

Class 派生类名(基类名):

例如创建student类,继承people类的代码。

class student(people):

三、多态

多态性依赖于继承。从一个父类派生出多个子类,可以使子类之间有不同的行为,这种行为称之为多态。更直白的说,就是子类重写父类的方法,使子类具有不同的方法实现。

子类与父类拥有同一个方法,子类的方法优先级高于父类,即子类覆盖父类。只要方法存在,参数正确,就可以调用。

如果在子类中定义的一个方法,其名称、返回类型及参数列表正好与父类中某个方法的名称、返回类型及参数列表相匹配,那么可以说,子类的方法重写了父类的方法。

方法重写在不同类,是实现多态的必要条件。

四、Account和FreeChecking类的实现

编程要求:补全Account和FreeChecking类的实现。

class Account:
    """An account has a balance and a holder.
    >>> a = Account('John')
    >>> a.deposit(12)
    12
    >>> a.balance
    12
    >>> a.interest
    0.02
    >>> a.time_to_retire(20)
    26
    >>> a.balance               # balance 保持不变
    12
    >>> a.withdraw(11) # 每次取款额度不超过10,超过无法取出
    "Can't withdraw that amount"
    >>> a.withdraw(10)
    2
    >>> a.withdraw(10)
    'Insufficient funds'
    """

    def __init__(self, account_holder):
        self.balance = 0
        self.holder = account_holder

    def deposit(self, amount):
        self.balance = self.balance + amount
        return self.balance

    def withdraw(self, amount):


    def time_to_retire(self, amount):
        """Return the number of years until balance would grow to amount."""
        assert self.balance > 0 and amount > 0 and self.interest > 0




class FreeChecking(Account):
    """A bank account that charges for withdrawals, but the first two are free!
    >>> ch = FreeChecking('Jack')
    >>> ch.balance = 20
    >>> ch.withdraw(100)  # 首次取款免费,不论是否成功,免费次数减少1次
    'Insufficient funds'
    >>> ch.withdraw(3)    # 第二次取款免费
    17
    >>> ch.balance
    17
    >>> ch.withdraw(3)    # 2次免费用完,开始收费
    13
    >>> ch.withdraw(3)
    9
    >>> ch2 = FreeChecking('John')
    >>> ch2.balance = 10
    >>> ch2.withdraw(3) # 首次免费
    7
    >>> ch.withdraw(3)  # 2次免费
    5
    >>> ch.withdraw(5)  # 余额不足
    'Insufficient funds'
    """


    def __init__(self, account_holder):


    def withdraw(self, amount):


import doctest
doctest.testmod()

具体实现:

class Account:
    # 此处已经略去case
    
    # 利率
    interest = 0.02
    # 最大取款额度
    max_amount = 10
    def __init__(self, account_holder):
        self.balance = 0
        self.holder = account_holder
        self.interest = Account.interest

    def deposit(self, amount):
        self.balance = self.balance + amount
        return self.balance

    def withdraw(self, amount):
        # 取款超过最大取款额度,不让取款
        if (amount > Account.max_amount):
            return "Can't withdraw that amount"
        # 余额不足,不让取款
        if (self.balance < amount):
            return 'Insufficient funds'
        self.balance -= amount
        return self.balance

    def time_to_retire(self, amount):
        """Return the number of years until balance would grow to amount."""
        assert self.balance > 0 and amount > 0 and self.interest > 0
        # 账户余额 = 本金+本金*(1+利息)
        amounts = self.balance
        years = 0
        while True:
            amounts += amounts * self.interest
            years += 1
            if (amounts >= amount):
                return years



class FreeChecking(Account):
 	# 此处已经略去case
 	
    # 初始账户余额
    init_balance = 20
    # 免费取款次数
    free_draw_times = 2
    # 取款手续费
    draw_fee = 1

    def __init__(self, account_holder):
        self.balance = FreeChecking.init_balance
        self.holder = account_holder
    def withdraw(self, amount):
        # 如果账户余额小于取款额度,不能取款,次数减一
        if (self.balance < amount):
            self.free_draw_times -= 1
            return 'Insufficient funds'
        # 如果免费次数大于0小于3,免费取款
        if (self.free_draw_times > 0 and self.free_draw_times < 3):
            self.balance -= amount
        # 否则收费取款
        else:
            # 如果存款比手续费加取款额度少,不让取款
            if (self.balance - (amount + FreeChecking.draw_fee) < 0):
                return 'Insufficient funds'
            # 可以取款
            self.balance -= (amount + FreeChecking.draw_fee)
        # 免费次数减一
        self.free_draw_times -= 1
        return self.balance

import doctest
doctest.testmod()

五、总结撒花

本文主要讲解了Python中的继承和多态的基本使用。

这就是今天要分享给大家的全部内容了,我们下期再见!

本文由初心原创,首发于CSDN博客, 博客主页:初心%

我在CSDN等你哦!

你可能感兴趣的:(Python从入门到精通,python,数学建模,开发语言)